在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. QTP图片验证/图片比较/二进制流对比法

    图片验证主要是文件对比,其中我们可以利用二进制的方法读取图片信息,然后进行对比,达到对比的效果,本例子利用fso对象的文件流的方法实现,代码如下: Public Function CompareFil ...

  2. php递归函数细节

    <?php /** *php递归函数细节 *从1到5的阶乘 * */ header("Content-Type:text/html;charset=utf-8"); func ...

  3. React-Native 之 生命周期

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...

  4. tomcat报错catalina.sh: line 401: /usr/java/jdk1.7.52/bin/java: No such file or directory

    将生产服务器的Tomcat目录打包过来后解压后,启动Tomcat后,发现如下问题: # ./shutdown.sh  Using CATALINA_BASE:   /usr/local/tomcat  ...

  5. ASP.NET结合COM组件发送Email

    在开发电子邮件发送程序的时候,我们经常需要使用到相应的组件,其实不需要第三方的组件(例如:Jmail)照常可以做到发送Email的功能. 在系统目录(如c:/winnt或c:/windows)的sys ...

  6. JDK7的新玩具java.util.Objects

    空指针异常这个坑爹的异常是初学开发者最常见的坑,那么今天为大家分享一个jdk的新工具java.util.Objects包.里面有很多工具可以帮我们避免空指针异常让我我们的代码写起来更加优雅.下面我们来 ...

  7. Zookeeper集群搭建以及python操作zk

    一.Zookeeper原理简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. Zookeeper设计目 ...

  8. 带你走进Android Afinal框架的世界

    1.什么是Afinal框架? Afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少.在android应用开发中,通过Afinal的ioc框架,诸如ui绑定 ...

  9. Java编程的逻辑 (17) - 继承实现的基本原理

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

  10. 转shell中的awk用法详解

        awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息 调用awk:   第一种,命令行方式 ...