Unity如何与C#类一起工作

通过研究纯C#,我发现Unity中的脚本(使用C#)有点不直观。

例如,看起来人们(初学者?)在Unity中使用脚本的最常见方式是创建一个“单次使用”类型脚本并将其附加到实际的游戏对象(通过单击并拖动到脚本组件)。 那样的话,继承似乎没什么用处。 或者我可能倒退了。 我是否应该在附加到游戏对象之外创建类/继承,然后仅将脚本附加到引用这些外部类的游戏对象? 我相信你们中的一些人可能会说“做你想做的事!” 或者“做什么有效”,但我不想从糟糕的编码方法开始,直到最终重新构建它。

另一件我感到困惑的事情是Unity中的类实例。 无论出于何种原因,似乎我可以使用Animator等内置类而不实例化它[我几乎从未见过a = new Class(); ],但这些类不是静态的。 这是如何运作的? 如果我的确建立了自己的类,这些类会被我的游戏对象所引用,那么我是否必须创建实例才能使用它们,或者这一切都是在引擎的引擎下完成的?

在所有这些脚本中,游戏对象(编辑器中的实际项目)在哪里? 是否有为每个游戏对象制作的课程? 而且,如果是这样,我该如何找到它并查看发生了什么?


Unity的继承与其他框架中的方式完全相关。

考虑你想实现两种类型的敌人,他们都有一些共同的行为(步行,攻击),并且都有特定的行为(A可以飞行但B使用寻路攻击)。 你会设计一个从MonoBehaviour继承的抽象Enemy类(btw脚本继承自继承自MonoBehaviour的行为,..,所以继承就在那里),然后每个继承自Enemy。

这对于维护而言更好,对于使用敌人也更好。 FlyingEnemy和PathEnemy可以存放在一个Enemy类型的集合中,允许你迭代它来执行普通的敌人行动(比如死亡)。

界面也是非常有用的,因为你可以拥有一个击中任何物体的弹丸。 炮弹将检查命中的GameObject是否包含IDamageable组件,如果是,则调用接口的Damage方法。 这可以在不知道它是玩家,敌人还是墙壁的情况下击中任何东西。 每个都在自己的脚本中实现接口,并且该方法只是执行相关操作。

如果没有这个,你的射弹必须经过一长串检查才能知道它是这个还是那个。


我团结了几场比赛,以我的经验,继承几乎没有用处。 这是因为统一并不是用oop来实现的,而是面向组件的编程,也就是你制作一个小型的单一目标组件(脚本)并将它们粘贴在一起来制作你的游戏对象。

当您将脚本添加到游戏对象时,引擎执行新的Class(); 为你工作。 这意味着每个gameobject都有一个附加到它的每个脚本的实例。 对于所有你制作的脚本和已经像Transform和Animator这样的统一脚本都是如此。 这当然只适用于从MonoBehaviour继承的统一脚本,因为它们是唯一可以添加到游戏对象中的东西。

您在场景层次结构中看到的gameobjects是来自类GameObject的实例。 为了理解它是如何工作的,我推荐阅读文档,但如果你想窥视游戏对象,你需要使用Telrik JustDecompile或Reflector来解密它。


统一继承的方式很简单,因为Unity试图使用组件模型和层次模型。 但说这很简单并不意味着它不存在。

当你创建一个新的类时,它从MonoBehaviour继承,这是一个有很多对象需要在引擎中工作的函数的类。

如果你想用你的脚本创建一个层次结构模型,你可能需要创建所有的基类作为MonoBehaviour的子元素,然后继承它。 请阅读@Everts示例

考虑你想实现两种类型的敌人,他们都有一些共同的行为(步行,攻击),并且都有特定的行为(A可以飞行但B使用寻路攻击)。 你会设计一个从MonoBehaviour继承的抽象Enemy类,然后每个继承自Enemy。

链接地址: http://www.djcxy.com/p/22373.html

上一篇: How Does Unity Works With C# Classes

下一篇: Confirming that jar files are being loaded