zoukankan      html  css  js  c++  java
  • 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方法中实例化变量对象。

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

  • 相关阅读:
    何为受控组件(controlled component)
    (组件的)状态(state)和属性(props)之间有何不同
    类组件(Class component)和函数式组件(Functional component)之间有何不同
    [翻译] FSLineChart
    [翻译] DXPopover
    [翻译] LTInfiniteScrollView
    设计模式
    [翻译] LLSimpleCamera
    [翻译] VLDContextSheet
    将Model对象转换成json文本或者json二进制文件
  • 原文地址:https://www.cnblogs.com/darrenji/p/4615116.html
Copyright © 2011-2022 走看看