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

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

  • 相关阅读:
    java数据结构之队列
    java数据结构之线性表
    habase 报错 ERROR: Can't get master address from ZooKeeper; znode data == null
    java.io.IOException: Could not find status of job:job_1534233312603_0002
    windows本地调试安装hadoop(idea) : ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
    搭建hadoop_之 创建3个虚拟机配置好网络
    java 数组
    java 中break 和continue 的非常规用法
    java运算符
    java数据类型
  • 原文地址:https://www.cnblogs.com/darrenji/p/4615116.html
Copyright © 2011-2022 走看看