• 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方法中实例化变量对象。

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

  • 相关阅读:
    Makefile 文件格式
    带你深入理解传递參数
    LeetCode OJ Basic Calculator II
    emacs 为什么找不到运行程序?
    iOS Dev (51)加急审核
    POJ 1159 Palindrome
    9.9递归和动态规划(十二)——小鸡吃米
    c++操作当前窗体句柄
    [Python]计算闰年时候出现的and和or优先级的问题以及短路逻辑
    静态代理模式
  • 原文地址:https://www.cnblogs.com/darrenji/p/4615116.html
Copyright © 2020-2023  润新知