当把一个脚本附加到一个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();
}
}
类似的方法还包括:
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();
PSCs[1] = gameObject.GetComponnetInChildren();
PSCs[2] = GameObject.Find("Wall").GetComponent();
}
void Start(){
foreach(PhysicCtrl psc in PSCs){
psc.addImpulse();
}
}
}
脚本初始化的时候经历了3个过程,分别是Awake,OnEnable和Start方法。一般放在Awake方法中初始化变量,在OnEnable方法中实例化变量对象。
参考资料:极客学院听课笔记