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

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

Unity3D实践系列11, 组件的添加和访问的更多相关文章

  1. Unity3D实践系列07,组件的启用或禁用开关,物体的的可见或不可见开关,以及相应事件

    创建一个Unity项目. 在"Project"窗口中,在"Asserts"中,添加"_MyScene"文件夹. 点击"File&q ...

  2. Unity3D实践系列05,为GameObject添加额外属性

    在Unity中,通常通过脚本为GameObject添加额外的属性.具体有2种方式:一种是通过硬编码为脚本字段赋值,另一种是通过反射在运行时给脚本字段赋值. 脚本通过字段硬编码为GameObject添加 ...

  3. Unity3D实践系列04, 脚本的生命周期

    Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...

  4. Unity3D实践系列09, 物理引擎与碰撞检测

    在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody.Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测.Collider组件中的"Is T ...

  5. Unity3D实践系列06,球体撞击物体游戏

    本篇实现一个球体在固定区域移动撞击Cube的游戏. 首先有1个Plane当作地面,1个Sphere当作球体,4个Cube当作墙,12个Cube当作被撞击物体,另外还有球体的撞击计算,在撞击的过程适时显 ...

  6. Unity3D实践系列08, MonoBehaviour类的各种触发事件

    在脚本的生命周期中,有Awake, Start, FixedUpdate, Update, LateUpdate等方法,其实这些属于MonoBehaviour类的事件响应方法,是MonoBehavio ...

  7. Unity3D实践系列03,使用Visual Studio编写脚本与调试

    在Unity3D中,只有把脚本赋予Scene中的GameObject,脚本才会得以执行. 添加Camera类型的GameObject. Unity3D默认使用"MonoDevelop&quo ...

  8. Unity3D实践系列10, Canvas画布的创建和使用

    Canvas是所有ui元素的父物体. 当添加一个Button类型的GameObject后,在"Hierarch"窗口中自动添加了一个Canvas,以及EventSystem. 在C ...

  9. ASP.NET Web API实践系列11,如何设计出优秀的API

    本篇摘自:InfoQ的微信公众号 在设计API的时候考虑的问题包括:API所使用的传输协议.支持的消息格式.接口的控制.名称.关联.次序,等等.我们很难始终作出正确的决策,很可能是在多次犯错之后,并从 ...

随机推荐

  1. linux下usb转串口驱动分析【转】

    转自:http://blog.csdn.net/txxm520/article/details/8934706 首先说一下linux的风格,个人理解 1. linux大小结构体其实是面向对象的方法,( ...

  2. 【前端开发】关于闭包最通俗易懂的解释 for循环,定时器,闭包混合一块的那点事。

    for循环,定时器,闭包混合一块的那点事. 1,对于一个基本的for循环,顺序输出变量值. for(var i = 1; i < 4; i++){ console.log(i);//结果不多说了 ...

  3. 抓包获取百度音乐API

    这次抓包是获取手机APP中的数据包,共分为三个部分: 1.win7建立wifi 2.PC架设代理服务器 手机设置代理 3.抓包分析 一.win7建立wifi 在win7下搭建wifi非常简单,网上的教 ...

  4. 更换网页tab标题图标

    在首页HTML文件中,加入link命令,<link>是放在<head>与</head>之间 例如下面这样: <HEAD><link rel = & ...

  5. Java编程的逻辑 (37) - 泛型 (下) - 细节和局限性

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  6. Java编程的逻辑 (58) - 文本文件和字符流

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  7. Qt编程之悲惨世界

    最近需要给人写点基于QtWebkit的代码,算是领教了Qt编程的痛苦之处. QNetworkConfigurationManager::isOnline() 只有在编译平台上能运行,拷贝到其他Wind ...

  8. vue-simple-uploader上传插件

    基于vue-simple-uploader封装文件分片上传.秒传及断点续传的全局上传插件 https://www.cnblogs.com/xiahj/p/vue-simple-uploader.htm ...

  9. P1244 青蛙过河

    P1244 青蛙过河NOI2000主要思想:数学归纳法 递推 压位高精度 化归 理解能力和找规律的能力题意再述:1.青蛙从上到下必须连续递增或者下面是石墩 而不能是1 12 33 4而且每时每刻都要满 ...

  10. CentOS图形界面下如何安装Eclipse和使用maven

    不多说,直接上干货! http://www.eclipse.org/downloads/packages/release/Kepler/SR2 下载到/usr/local/下,解压完成之后,我们想用这 ...