如何在 Unity 中有效地使用继承?

ani*_*glu 1 c# inheritance unity-game-engine

我对继承有基本的了解,但由于我想要作为游戏对象上的组件的每个脚本都必须从 MonoBehaviour 继承,事情变得很棘手。

假设我想要一个名为“Character”的基类,并且希望“Player”和“Enemy”从“Character”派生。我该如何将 Player 和 Enemy 脚本添加到 Player 和 Enemy 对象而不出现错误?

我还尝试创建空游戏对象并向其中添加CharacterStats,然后使用具有不同统计数据的不同角色对象填充此类。你猜怎么着,如果脚本派生自 Monobehaviour,则不能使用 new 关键字创建对象。

有一些关于这个主题的教程可以让它更清楚吗?

Chu*_*uck 7

可能需要理解的是它MonoBehaviour本身继承Component- MonoBehaviour 是一个组件。

当您将组件视为事物的一部分时,至少在一定程度上可以理解,您不能只是new一个组件 - 我可以制作一个吗new Arm?如果我这样做了,它会去哪里?但我可以先做一个new Body body,然后再做body.AddComponent<Arm>,对吗?因为这样手臂会发生什么就很清楚了——它会附着在身体上

同样,您不能只是new一个组件,因为它们应该是游戏对象的一部分。可以做的是创建一个新的游戏对象并.AddComponent<>()添加到该对象。再次强调,现在该组件的去向已经很清楚了。

我总体上同意UnholySheep 的评论,即您应该更喜欢组合而不是继承,因为这通常会使您的代码更加模块化。也就是说,我肯定也使用继承。

当你概述你的课程时,你应该问自己的问题是:“这个新课程是一种 _____ 还是这个新课程有一个 _____”。我想很容易说玩家是角色,敌人是角色,但是您需要子类化吗?或者玩家只是一个也有玩家控制器的角色吗?也许你可以有一个类似的界面IPlayerController,有一个LocalPlayerController用于用户,一个AIPlayerController用于敌人?通过编程解决问题的方法有很多。

或者也许所有角色都有一个 PlayerController,而.activeControl对于非玩家角色来说,只是该位为 false。然后你就可以做幽灵/旁观 NPC 之类的事情。

但具体针对你的问题:

假设我想要一个名为“Character”的基类,并且希望“Player”和“Enemy”从“Character”派生。我该如何将 Player 和 Enemy 脚本添加到 Player 和 Enemy 对象而不出现错误?

您将从继承 MonoBehaviour 的脚本开始Character,并实现两个类共有的任何逻辑:

public class Character : MonoBehaviour
{
    // Your common character logic
}
Run Code Online (Sandbox Code Playgroud)

然后你会让子类继承Character

public class Player : Character
{
    // Your Player-specific logic here
}
Run Code Online (Sandbox Code Playgroud)

public class Enemy : Character
{
    // Your Enemy-specific logic here
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将EnemyPlayer脚本添加到编辑器中的 GameObject,也可以通过获取对目标 GameObject 的引用(通过在编辑器中设置引用或在脚本中创建新的 GameObject)以编程方式执行此操作,然后调用targetGameObject.AddComponent<YourComponentToAdd>();.