简单了解一下Unity中的
GameObject和绑定在GameObject上的Component。
GameObject和Component都是继承自UnityEngine.Object,此Object不同于C#的object。
关于Object:
name:Component的name分享了其所绑定的GameObject的name属性。当修改Component的name属性时,GameObject的name属性也会被修改。或许这个属性是专门为GameObject设计的。GetInstanceID():每一个Object都有一个独一无二的IDDestroy():作为GameObejct调用该方法时,会同时Destroy所有的Component和children;作为Component调用时,只会Destroy自己。Destroy的发生时机值得注意,在Update loop之后,rendering之前,也就是说是在当前帧完成的。当场景发生变化时,当前场景的所有对象会被Destroy,使用DontDestroyOnload()可以阻止。FindObjectOfType():由于使用反射实现,这个方法非常耗时间。Instantiate():这个方法用于克隆GameObject。不论是作为GameObject调用还是作为Component调用,结果都是将相应的GameObject及其children,Component一起克隆。可以通过参数修改位姿,父对象和坐标系等。值得注意的是,克隆后的对象默认是没有父对象的。
然后是GameObject,场景中的所有对象都是GameObject。
说GameObject就不得不说transfrom,任何GameObject出生都自带Transfrom类型的Component作为其属性。
Transform是用于控制场景中对象的位姿的,除此之外,Transform提供了一个很重要的特性:children。
关于GameObject:
- 激活:只有当该对象的父对象处于激活状态并且该对象的local active状态为
true时,该对象才处于激活状态。SetActive()方法仅可修改local active状态。 transform:大多数情况下,一个GameObject唯一对应一个Transform。- 事件:可以通过
SendMessage()等方法来调用该GameObject及其父子对象上绑定的MonoBehaviour的方法。(猜想,可能是反射实现的) Component相关:当然有添加与获取的相关方法。- Find:Find相关的几个方法非常耗费时间(一个场景成千上万的对象),应该将结果缓存起来。
GameObject说完了就该说Component了。Component一般绑定在GameObject上面:
- 访问
GameObject:Component有很多方法,属性可以通向GameObejct,如gameObject属性,transform属性,tag属性(注意,Component不需要tag,这个tag像name一样,指的是GameObject的tag)。 - Message和Component相关的方法:这些方法应该是调用了
GameObject的同名方法;这样会方便一点吧。
Component有一系列常用子类,如Rigidbody,Collider等,其中有一个十分重要,Behaviour(主要是它的子类MonoBehaviour),用的非常多。
Behaviour和Component的主要差异仅在于启用禁用控制上面。就像GameObject有active状态一样,MonoBehaviour也有enable状态。
MonoBehaviour是几乎所有Unity脚本都要继承的类。
本文主要介绍了Unity中的组件和对象相关知识。组件继承自特定类,不同组件有不同属性和方法,如分享绑定对象属性、有唯一ID、克隆等。对象的激活状态受父对象影响,还介绍了组件与对象的访问、事件调用等方法,以及常用子类和差异。

916

被折叠的 条评论
为什么被折叠?



