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方法中实例化变量对象。
参考资料:极客学院听课笔记
Unity3D实践系列11, 组件的添加和访问的更多相关文章
- Unity3D实践系列07,组件的启用或禁用开关,物体的的可见或不可见开关,以及相应事件
创建一个Unity项目. 在"Project"窗口中,在"Asserts"中,添加"_MyScene"文件夹. 点击"File&q ...
- Unity3D实践系列05,为GameObject添加额外属性
在Unity中,通常通过脚本为GameObject添加额外的属性.具体有2种方式:一种是通过硬编码为脚本字段赋值,另一种是通过反射在运行时给脚本字段赋值. 脚本通过字段硬编码为GameObject添加 ...
- Unity3D实践系列04, 脚本的生命周期
Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...
- Unity3D实践系列09, 物理引擎与碰撞检测
在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody.Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测.Collider组件中的"Is T ...
- Unity3D实践系列06,球体撞击物体游戏
本篇实现一个球体在固定区域移动撞击Cube的游戏. 首先有1个Plane当作地面,1个Sphere当作球体,4个Cube当作墙,12个Cube当作被撞击物体,另外还有球体的撞击计算,在撞击的过程适时显 ...
- Unity3D实践系列08, MonoBehaviour类的各种触发事件
在脚本的生命周期中,有Awake, Start, FixedUpdate, Update, LateUpdate等方法,其实这些属于MonoBehaviour类的事件响应方法,是MonoBehavio ...
- Unity3D实践系列03,使用Visual Studio编写脚本与调试
在Unity3D中,只有把脚本赋予Scene中的GameObject,脚本才会得以执行. 添加Camera类型的GameObject. Unity3D默认使用"MonoDevelop&quo ...
- Unity3D实践系列10, Canvas画布的创建和使用
Canvas是所有ui元素的父物体. 当添加一个Button类型的GameObject后,在"Hierarch"窗口中自动添加了一个Canvas,以及EventSystem. 在C ...
- ASP.NET Web API实践系列11,如何设计出优秀的API
本篇摘自:InfoQ的微信公众号 在设计API的时候考虑的问题包括:API所使用的传输协议.支持的消息格式.接口的控制.名称.关联.次序,等等.我们很难始终作出正确的决策,很可能是在多次犯错之后,并从 ...
随机推荐
- Linux获取/dev/input目录下的event对应的设备【转】
转自:https://blog.csdn.net/qq_21792169/article/details/51458855 当我们在Linux操作系统下使用input子系统时,当我们先插鼠标,在插上摄 ...
- oracle日期、转换函数
转换函数 日期类型转换成字符类型 select to_char(sysdate) s1, --14-3月 -16 to_char(sysdate, 'yyyy-mm-dd') s2, - ...
- Java中static关键字概述
例如一个学生类中,我们需要统计下学生类中学生对象的数量,此时数量要定义为静态变量: 示例代码: package com.java1995; public class Student { int id= ...
- C# Message类的属性Msg所关联的消息ID
C# Message类的属性Msg所关联的消息ID https://msdn.microsoft.com/en-us/library/windows/desktop/ms645606(v=vs.8 ...
- vmware提示:此虚拟机似乎正在使用中,无法取得所有权的解决办法
在虚拟机运行时,一次非正常关机.导致虚拟机出现以下错误: 此虚拟机似乎正在使用中. 如果此虚拟机已在使用中,请按“取消”按钮,以免损坏它.如果此虚拟机未使用,请按“取得所有权(&T)”按钮以获 ...
- java 内部类 工厂方法
用内部类实现工厂模式 :优先使用类而不是接口,如果你的设计中需要某个接口,你必须了解它,否则不到迫不得已,不要将其放到你的类中 //: innerclasses/Factories.java impo ...
- Windows下安装Python requests模块
在使用自己写的或者别人的python小工具时可能会出现类似ImportError: No module named Requests的问题: D:\tool\python\fuzz>Fuzz.p ...
- 9-2 The Tower of Babylon uva437 (DP)
题意:有n种立方体 每种都有无穷多个 要求选一些立方体叠成一根尽量高的柱子 (可以自行选择哪条边为高 )使得每个立方体的底面都严格小于他下方的立方体 为DAG模型 在任何时候 只有顶面的尺寸会影响到 ...
- vim/sed/awk/grep等文件批处理总结
Vim相关操作 1.基础 * 和 # 对对当前光标所在的单词进行搜索 %匹配括号移动,包括 (, {, [ K 查看man手册 ga 查看ascii值 g CTRL-G 统计字数,使用Visual模式 ...
- SpringMVC框架02——SpringMVC的Controller详解
1.基于注解的控制器 1.1.@Controller 注解类型 在SpringMVC中使用org.springframework.stereotype.Controller注解类型声明某类的实例是一个 ...