zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Unity3D实践系列11, 组件的添加和访问

组件 系列 实践 添加 访问 11 Unity3D
2023-09-11 14:16:51 时间

 

当把一个脚本附加到一个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方法中实例化变量对象。

 

参考资料:极客学院听课笔记