当把一个脚本附加到一个GameObject上的时候,这个GameObject就有了脚本组件。
通过GameObject的属性获取组件
比如如下:
[RequireComponent(typeof(Rigidbody))]public class PhysicCtrl : MonoBehaviour{public Rigidbody rb;void Start(){rb = gameObject.rigidbody;rb.AddForce(0,0,-10,ForceMode.Impulse);}}
以上,rigidbody是GameObject的属性,通过GameObject的属性获取了组件。
如果我们自定义一个脚本:
public class CollisionAndTrigger : MonoBehaviour{}
现在,在PhysicCtrl脚本中引用CollisionAndTrigger脚本组件。
[RequireComponent(typeof(Rigidbody))]public class PhysicCtrl : MonoBehaviour{public Rigidbody rb;CollisionAndTrigger cat;void Start(){rb = gameObject.rigidbody;rb.AddForce(0,0,-10,ForceMode.Impulse);cat=gameObject.}}
以上,当在Start方法中,gameObject后点不出来自定义的脚本组件。这是因为CollisionAndTrigger脚本组件不是Unity3D自带的,是我们自定义的。
通过GameObject的泛型实例方法获取组件
点不出来没关系,Unity3D为我们提供了GetComponent<r>泛型方法来获取自定义的组件。
[RequireComponent(typeof(Rigidbody))]public class PhysicCtrl : MonoBehaviour{public Rigidbody rb;public CollisionAndTrigger cat;void Start(){rb = gameObject.rigidbody;rb.AddForce(0,0,-10,ForceMode.Impulse);cat=gameObject.GetComponent<CollisionAndTrigger>();}}
类似的方法还包括:
gameObject.GetComponentInParent<PhysicCtrl>
gameObject.GetComponentInChild<PhysicCtrl>
GameObject还有增加组件的实例方法:
gameObject.AddComponent<PhysicCtrl>();
在有些时候,还可以使用GetComponent的这个非泛型实例方法。
public class ExampleClass : MonoBehaviour{public HigerJoint hinge;void Example(){hinge = gameObject.GetComponent("HingerJoint") as HingerJoint;hinge.useSpring = false;}}
通过GameObject的静态方法
GameObject.Find("Wall").GetComponent<PhysicCtrl>();
例子
public class SetComponent : MonoBehaviour{//如果在声明变量的时候初始化,需要Reset一下才能看到public PhysicCtrl[] PSCs;//一般放在Awake方法中初始化变量void Awake(){PSCs = new PhysicCtrl[3];}void OnEnable(){PSCs[0] = gameObject.GetComponentInParent<PhysicCtrl>();PSCs[1] = gameObject.GetComponnetInChildren<PhysicCtrl>();PSCs[2] = GameObject.Find("Wall").GetComponent<PhysicCtrl>();}void Start(){foreach(PhysicCtrl psc in PSCs){psc.addImpulse();}}}
脚本初始化的时候经历了3个过程,分别是Awake,OnEnable和Start方法。一般放在Awake方法中初始化变量,在OnEnable方法中实例化变量对象。
参考资料:极客学院听课笔记