在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 initialization
    void Start () {

    }

    // Update is called once per frame
    void 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 initialization
    void Start () {

    }

    // Update is called once per frame
    void 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 initialization
    void Start () {

    }

    // Update is called once per frame
    void 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 initialization
    void Start () {

    }

    // Update is called once per frame
    void 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 initialization
    void Start ()
    {
        objectSerialized = GameObject.Find("Cube");
    }



    // Update is called once per frame
    void 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 initialization
    void Start ()
    {
        objectSerialized = GameObject.FindGameObjectWithTag("mycute");
    }



    // Update is called once per frame
    void Update () {

    }
}


再次运行,点击"Hierarchy"窗口中GameObject,看到如下:

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

Unity3D实践系列05,为GameObject添加额外属性的更多相关文章

  1. Unity3D实践系列11, 组件的添加和访问

    当把一个脚本附加到一个GameObject上的时候,这个GameObject就有了脚本组件. 通过GameObject的属性获取组件 比如如下: [RequireComponent(typeof(Ri ...

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

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

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

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

  4. ASP.NET Web API实践系列05,消息处理管道

    ASP.NET Web API的消息处理管道可以理解为请求到达Controller之前.Controller返回响应之后的处理机制.之所以需要了解消息处理管道,是因为我们可以借助它来实现对请求和响应的 ...

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

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

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

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

  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. Unity3D实践系列08, MonoBehaviour类的各种触发事件

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

随机推荐

  1. os_mudule_docs

    pydoc os Help on module os: NAME os - OS routines for Mac, NT, or Posix depending on what system we' ...

  2. centos7切换启动内核

    1.查看当前系统内核 uname -r 3.18.6-2.el7.centos.x86_64 查看可使用的内核列表 awk -F\' '$1=="menuentry " {prin ...

  3. mysql ON DUPLICATE KEY UPDATE重复插入时更新

    mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (c ...

  4. Java abstract 关键字

    abstract是声明抽象类和抽象方法的关键字 包含抽象方法的类叫抽象类,如果一个类中包含一个或多个抽象方法,该类必须被限定为抽象的,否则编译器会报错,抽象类不可创建对象,创建抽象类的对象编译器会报错 ...

  5. svn导入项目和部署方面的相关问题

    前一阵子忙于部署项目的事情,在这个过程之中遇到了一些问题,查阅了相关资料解决了问题于是就决定分享给大家,可能会对大家有一定的帮助.我在下面中可能会提到dubbo的一些问题,dubbo是用于分布式的系统 ...

  6. Redis学习笔记9--Redis持久化

    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.redis支持四种持久化方式,一是 Snapshotting(快照)也是默认方式:二是Appen ...

  7. [java] 数据处理

    背景: 有一组30天内的温度与时间的数据,格式如下: 详细情况:共30天的8k+项数据,每天内有260+项,每个记录温度的时间精确到秒 任务就是想根据这样的数据找到规律,来完成给定具体的时间预测出此时 ...

  8. 004.LVM缩减

    一 缩减步骤 卸载挂载点 检查文件系统 调整分区大小 缩减LV大小 重新挂载并检查 注意: 1 减少文件的大小一定需要按照上面提高的4个规定动作顺序来做,在缩减LV大小前,首先要缩减filesyste ...

  9. Qt编译好的oracle驱动下载

    在上文,我累赘了一大堆,给大家写了一篇Qt如何编译OCI驱动,在这里自然就不再累赘了,直接附上编译好的文件供大家下载: <Qt5.3.1+OCI驱动下载地址> 有经济来源的请传送:http ...

  10. 基于jquery的水平滚轴组件,多参数可设置。

    闲来无事,继续封装.此次封装的为水平滚轴组件,可选择滚动的距离大小.闲话不多说,直接上图. 参数说明: vis:4                中间区域可显示的 li 个数 scroll:4     ...