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

 

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

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值