Unity3D实践系列05,为GameObject添加额外属性
在Unity中,通常通过脚本为GameObject添加额外的属性。具体有2种方式:一种是通过硬编码为脚本字段赋值,另一种是通过反射在运行时给脚本字段赋值。
脚本通过字段硬编码为GameObject添加额外的属性
创建一个空的GameObject。
点击"Hierarchy"窗口下的GameObject,看到如下的"Inspector"窗口。

现在我们要为这个GameObject增加一个Count属性,该怎么做呢?
在"Project"窗口下的"Asserts"中的"_MyScripts"文件夹下创建一个名称为"MyVariable"的脚本文件。
双击"MyVariable"脚本文件,文件在Visual Studio中打开,编辑如下:
using UnityEngine;using System.Collections;public class MyVariable : MonoBehaviour{public int Count = 1;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}}
保存"MyVariable"脚本文件,把之拖动到"Hierarchy"窗口下的GameObject上方。此时,GameObject对应的"Inspector"窗口中多了一个Count属性。

至此,通过脚本文件为GameObject添加了额外的属性。
在Unity中,如果脚本中的字段被打上[SerializeField]特性,该字段也会成为GameObject的额外属性。
using UnityEngine;using System.Collections;public class MyVariable : MonoBehaviour{public int Count = 1;[SerializeField]private GameObject objectSerialized;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}}

在Unity中,即使是一个public的字段,如果打上[HideInInspector]特性,该字段就不会出现在Inspector窗口中。
using UnityEngine;using System.Collections;public class MyVariable : MonoBehaviour{public int Count = 1;[SerializeField]private GameObject objectSerialized;[HideInInspector]public GameObject objectNotPublic;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}}
以上,objectNotPublic字段不会出现在Inspector窗口中。

在Unity脚本中,不仅可以声明C#的基本数据类型,还可以声明Unity独有的引用类型,比如Vector2, Vector3, Quaternion, GameObject,甚至是自定义类型,等等。
另外,当点击组件的Reset,实际上是调用了MonoBehaviour类的Reset方法,会对所有字段属性初始化。我们还可以在自定义组件中重写Reset方法。
using UnityEngine;using System.Collections;public class MyVariable : MonoBehaviour{public int Count = 1;[SerializeField]private GameObject objectSerialized;[HideInInspector]public GameObject objectNotPublic;void Reset(){Count = 2;}// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}}
当再次点击组件的Reset按钮,呈现如下:

脚本通过反射为GameObject动态添加额外属性
为Scene添加2个GameObject类型的Cube。
修改MyVariable类文件如下:
using UnityEngine;using System.Collections;public class MyVariable : MonoBehaviour{public int Count = 1;[SerializeField]private GameObject objectSerialized;[HideInInspector]public GameObject objectNotPublic;void Reset(){Count = 2;}// Use this for initializationvoid Start (){objectSerialized = GameObject.Find("Cube");}// Update is called once per framevoid Update () {}}
由于是在运行时通过反射来给MyVariable中GameObject类型的字段objectSerialized赋值,所以需要运行项目才可以看到MyVariable脚本的objectSerialized字段值。
运行。
点击"Hierarchy"窗口中GameObject,可以看到"Inspector"窗口中,通过反射为objectSerialized字段赋的值。

还可以通过GameObject的Tag名称,使用反射为字段动态赋值。
点击"Hierarch"窗口中的一个Cube,为其添加一个tag。

再次修改MyVariable类文件如下:
using UnityEngine;using System.Collections;public class MyVariable : MonoBehaviour{public int Count = 1;[SerializeField]private GameObject objectSerialized;[HideInInspector]public GameObject objectNotPublic;void Reset(){Count = 2;}// Use this for initializationvoid Start (){objectSerialized = GameObject.FindGameObjectWithTag("mycute");}// Update is called once per framevoid Update () {}}
再次运行,点击"Hierarchy"窗口中GameObject,看到如下:

参考资料:极客学院听课笔记
Unity3D实践系列05,为GameObject添加额外属性的更多相关文章
- Unity3D实践系列11, 组件的添加和访问
当把一个脚本附加到一个GameObject上的时候,这个GameObject就有了脚本组件. 通过GameObject的属性获取组件 比如如下: [RequireComponent(typeof(Ri ...
- Unity3D实践系列04, 脚本的生命周期
Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...
- Unity3D实践系列06,球体撞击物体游戏
本篇实现一个球体在固定区域移动撞击Cube的游戏. 首先有1个Plane当作地面,1个Sphere当作球体,4个Cube当作墙,12个Cube当作被撞击物体,另外还有球体的撞击计算,在撞击的过程适时显 ...
- ASP.NET Web API实践系列05,消息处理管道
ASP.NET Web API的消息处理管道可以理解为请求到达Controller之前.Controller返回响应之后的处理机制.之所以需要了解消息处理管道,是因为我们可以借助它来实现对请求和响应的 ...
- Unity3D实践系列09, 物理引擎与碰撞检测
在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody.Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测.Collider组件中的"Is T ...
- Unity3D实践系列07,组件的启用或禁用开关,物体的的可见或不可见开关,以及相应事件
创建一个Unity项目. 在"Project"窗口中,在"Asserts"中,添加"_MyScene"文件夹. 点击"File&q ...
- Unity3D实践系列03,使用Visual Studio编写脚本与调试
在Unity3D中,只有把脚本赋予Scene中的GameObject,脚本才会得以执行. 添加Camera类型的GameObject. Unity3D默认使用"MonoDevelop&quo ...
- Unity3D实践系列10, Canvas画布的创建和使用
Canvas是所有ui元素的父物体. 当添加一个Button类型的GameObject后,在"Hierarch"窗口中自动添加了一个Canvas,以及EventSystem. 在C ...
- Unity3D实践系列08, MonoBehaviour类的各种触发事件
在脚本的生命周期中,有Awake, Start, FixedUpdate, Update, LateUpdate等方法,其实这些属于MonoBehaviour类的事件响应方法,是MonoBehavio ...
随机推荐
- C语言内存分布
C语言内存分布 典型的C语言程序内存表示分区共有5个部分: 正文段 Text segment 已初始化数据段(数据段)Initialized data segment 未初始化数据段(bss)Unin ...
- 使用/dev/uinput的简要介绍(含demo程序)【转】
转自:https://blog.csdn.net/zhongkunjia/article/details/75142699 uinput机制有2个很大的优点: 1) 不用自己写驱动(比如弄个红外遥控器 ...
- C#中的GetElementsByClassName方法
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public static class Spread { ...
- 公共语言运行库(CLR)开发系列课程(3):COM Interop基础 学习笔记
上章地址 什么是COM Component Object Model 组建对象模型 基于接口(Interface) 接口=协议 IID 标识接口 V-table 虚表 方式调用 单继承 对象(Obje ...
- DDD领域模型企业级系统(三)
相关代码: public static void ShowArray() { //数据源 int[] arrayas = new int[] { 1, 2, 3, 4 }; //创建查询 var qu ...
- NET 架构指南频道
NET 架构指南频道 微软在Visual Studio 2017 正式发布的时候也上线了一个参考应用https://github.com/dotnet/eShopOnContainers , 最近微软 ...
- Python装饰器进阶
装饰器进阶 现在,我们已经明白了装饰器的原理.接下来,我们还有很多事情需要搞清楚.比如:装饰带参数的函数.多个装饰器同时装饰一个函数.带参数的装饰器和类装饰器. 装饰带参数函数 def foo(fun ...
- 007.LVM查看命令
一 PV查看 [root@kauai ~]# pvdisplay #显示有关物理卷的信息 --- Physical volume --- PV Name /dev/sdb5 #PV名称 VG Name ...
- docker 网络的几种模式
docker 网络分为单机和多机,我们来了解一下docker的单机网络 docker单机网络分为以下几种: 1)bridge NetWork,使用--net=bridge指定,默认设置.2)Host ...
- Mysql - 参数修改
概述 mysql的参数可以分为两类:a. 动态参数,数据库启动期间能被修改,而修改又分为两种(global级,session级).b. 静态参数,即数据库启动期间不能修改. 接下来利用参数wait_t ...