Unity如何与c#类一起工作?
本文关键字:一起 工作 Unity | 更新日期: 2023-09-27 18:16:46
来自纯粹的c#学习,我发现Unity中的脚本(使用c#)有点不直观。
例如,人们(初学者?)在Unity中使用脚本的最常见方式似乎是创建一个"单一使用"类型的脚本,并将其附加到实际的游戏对象(通过点击并拖动它到脚本组件)。这样看来,继承似乎没什么用。或许我想反了。我是否应该在附加到游戏对象之外创建类/继承,然后只将脚本附加到引用这些外部类的游戏对象上?我相信你们中的一些人可能会说"做你想做的!"或"做有效的",但我不想从糟糕的编码方法开始,只是为了在以后的日期重构它。
我感到困惑的另一件事是Unity中的类实例。无论出于何种原因,我似乎可以使用内置类,如Animator而无需实例化它[我几乎从未见过a = new Class();但这些类并不是静态的。这是怎么做到的呢?如果我确实创建了自己的类,并被我的游戏对象所引用,我是否必须创建实例来使用它们,或者这一切都是由引擎在引擎盖下完成的?
在所有这些脚本中,游戏对象(编辑器中的实际项目)在哪里?是否有一个类是为每个游戏对象?如果有的话,我该如何找到它,并窥视它到底发生了什么?
继承在Unity中是完全相关的,就像在其他框架中一样。
假设你想要执行两种类型的敌人,它们都有一些共同的行为(行走,攻击),并且都有特定的行为(A可以飞行,但B使用寻径进行攻击)。你可以设计一个抽象的敌人类继承MonoBehaviour(游戏邦注:脚本继承MonoBehaviour,而MonoBehaviour又继承Behaviour)。,所以继承就在这里),然后每个都继承自敌人。
这是更好的维护,但也使用你的敌人。FlyingEnemy和PathEnemy可以存储在Enemy类型的集合中,允许你迭代它来执行常见的敌人动作(比如死亡)。
界面也非常有用,因为你可以在关卡中使用射弹击中任何东西。弹丸将检查击中的GameObject是否包含idamagable组件,如果是,则调用界面的Damage方法。这让玩家能够在不知道是玩家、敌人还是墙壁的情况下击中任何物体。每个人都在自己的脚本中实现接口,方法只执行相关操作。
如果没有这个,你的弹丸将不得不通过一长串检查来知道它是这个还是那个。
我用unity制作过几款游戏,根据我的经验,继承几乎没有用。这是因为unity并不是基于面向对象的编程,而是基于面向组件的编程,即你创造一个小型的单一用途组件(脚本)并将它们粘贴在一起去创造你的游戏对象。
当你向游戏对象添加脚本时,引擎会执行新的Class();为你工作。这意味着每个游戏对象都有一个附加到它的脚本实例。这适用于所有脚本,无论是你制作的脚本还是已经在unity中的脚本(如Transform和Animator)。这当然只适用于从MonoBehaviour继承的unity脚本,因为它们是你唯一可以添加到游戏对象的东西。
你在场景层次中看到的游戏对象是来自GameObject类的实例。为了理解它是如何工作的,我建议你只阅读文档,但如果你想窥探游戏对象,你需要使用Telrik JustDecompile或Reflector之类的东西来隐藏它。
unity中的继承以一种简单的方式出现,因为unity尝试使用组件模型而不是层次模型。但是说它简单并不意味着它不存在。
当你创建一个新类时,它继承了MonoBehaviour, MonoBehaviour是一个类,它有很多对象需要在引擎中工作的函数。
如果你想用你的脚本创建一个层次模型,你可能需要创建所有的基类作为MonoBehaviour的子类,然后从它继承。请阅读@Everts示例
假设你想要执行两种类型的敌人,它们都有一些共同的行为(行走,攻击),并且都有特定的行为(A可以飞行,但B使用寻径进行攻击)。你可以设计一个抽象的Enemy类,继承MonoBehaviour,然后每个类都继承Enemy。