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

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

  • 相关阅读:
    十分钟-Nginx 入门到上线
    83.面向忙碌开发者的 Android 知识点收录 (转)
    技术人,为什么需要构建知识图谱 (转载)
    C# 4.0四大新特性代码示例与解读
    .NET 项目代码风格要求
    .NET 推荐博客
    C# 五、谈扩展方法的理解
    ASP.NET 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
    ASP.NET 你必须知道的EF知识和经验
    Linq表达式、Lambda表达式你更喜欢哪个?
  • 原文地址:https://www.cnblogs.com/darrenji/p/4615116.html
Copyright © 2020-2023  润新知