Unity如何处理C#类

Unity如何处理C#类,c#,unity3d,C#,Unity3d,通过学习纯C#,我发现Unity中的脚本(使用C#)有点不直观 例如,人们(初学者?)在Unity中使用脚本的最常见方式似乎是创建一个“单次使用”类型的脚本并将其附加到实际的游戏对象(通过单击并将其拖动到脚本组件)。这样看来,继承似乎没有什么用处。或者我把它倒过来了。我是否应该在附加到游戏对象之外创建类/继承,然后只将脚本附加到引用这些类之外的游戏对象?我相信你们中的一些人可能只是说“想做什么就做什么!”或“做什么就做什么”,但我不想一开始就用糟糕的编码方法,而只是在以后重构它 另一件让我感到困

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

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

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


在所有这些脚本中,游戏对象(编辑器中的实际项目)在哪里?是否为每个游戏对象创建了一个类?如果是这样的话,我该如何找到它并窥探它的来龙去脉呢?

我在unity中做了一些游戏,根据我的经验,继承几乎没有任何用处。这是因为unity并不是为了oop而设计的,而是面向组件的编程,也就是说,你可以制作一个小型的单用途组件(脚本),然后将它们粘贴在一起,形成你的游戏对象

将脚本添加到游戏对象时,引擎将执行新类();为你工作。这意味着每个游戏对象都有一个附加到其上的每个脚本的实例。这对于所有脚本都是正确的,无论是您制作的脚本还是已经统一的脚本,如Transform和Animator。当然,这只适用于继承自MonoBehavior的unity脚本,因为它们是唯一可以添加到游戏对象中的东西


在场景层次中看到的游戏对象是类GameObject中的实例。为了理解它是如何工作的,我建议您只阅读文档,但如果您想窥视游戏对象,则需要使用Telrik JustDecompile或Reflector之类的工具对其进行分解。

继承在Unity中完全相关,就像在其他框架中一样

假设您想要实现两种类型的敌人,它们都有一些共同的行为(行走、攻击)和特定的行为(A可以飞行,但B使用寻路进行攻击)。您将设计一个从MonoBehavior继承的抽象敌方类(顺便说一句,脚本继承自MonoBehavior,它继承自Behavior,…,所以继承就在这里),然后每个类都继承自敌方

这对维护和使用敌人都有好处。Flyingemy和Path敌军可以存储在敌人类型的集合中,允许您在其上迭代以执行常见的敌人行动(如死亡)

界面也非常有用,因为你可以有一个射弹击中关卡上的任何东西。投射物将检查命中游戏对象是否包含可识别伤害的组件,如果是,则调用界面的伤害方法。这允许在不知道是玩家、敌人还是墙的情况下攻击任何东西。每个方法都在自己的脚本中实现接口,并且方法只执行相关操作


如果没有这个,你的射弹将不得不通过一长串的检查来知道它是这个还是那个

unity中的继承以一种简单的方式实现,因为unity尝试使用组件模型代替层次模型。但是说它很简单并不意味着它不存在

当您创建一个新类时,它从MonoBehavior继承而来,MonoBehavior是一个具有许多函数的类,对象需要在引擎中工作

如果您想用脚本创建层次结构模型,您可能需要将所有基类创建为MonoBehavior的子类,然后从中继承。请阅读@Everts示例

假设您想要实现两种类型的敌人,它们都有一些共同的行为(行走、攻击)和特定的行为(A可以飞行,但B使用寻路进行攻击)。您将设计一个从MonoBehavior继承的抽象敌方类,然后每个类都从敌方继承


阅读基于组件的(游戏)设计。每个脚本都是从monobehavior继承的组件。几乎不需要对组件进行子类化,事实上,从类层次结构的角度来看,平面设计更可取,建议游戏程序使用。必须同意上述意见。我在试图强制使用层次结构和基于继承的模型时把自己弄得筋疲力尽。在Unity中实现不仅是一件痛苦的事情,而且它使您的游戏(序列化)节省了很多时间。harderA平面设计被推荐用于游戏?我没听说过。当我的敌人来自Goin'Mental中的一个基本敌人类时,继承层次结构对我很有用。你也可以使用
.GameObject
属性从任何组件/
monobhavior
实例访问
GameObject
实例。“继承几乎没有任何用处”这是完全错误的,可能是十大最糟糕的建议。当然,Unity是组件驱动的,但这并不意味着它不是OOP。组件还意味着可重用性,在设计武器时,您将在武器抽象类中存储所有公共信息,并使子类从中继承。然后你的猎枪会做特定的猎枪动作,而你的机枪会做MG动作。此外,它还将使用一些接口进行损坏或其他行为。这就是OOP和继承。