简单了解一下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脚本都要继承的类。