Unity3D中的属性标识

1. 类级别标识

1.1 AddComponentMenu 添加组件菜单

默认的脚本都会出现在”Component->Script”菜单下,在类之前通过AddComponentMenu标识可以设定脚本出现在Component下的其它目录。注意该标识生效需要重启Unity3D。
eg:

[AddComponentMenu("MyTest/Test")]
public class Test : MonoBehaviour
{
} 

1.2 ExecuteInEditMode Editor模式下运行

Editor模式下运行三种函数调用的方式如下:
Update() 当Scene视图有改变的时候被调用
OnGUI() 当Game视图收到一个事件的时候被调用
OnRenderObject() Scene或者Game视图重绘时被调用

1.3 RequireComponent 脚本的运行依赖某组件的存在

1.4 Serializable 可序列化

该标识可以使得类(结构)级别的变量显示在检视面板,也能序列化它。
(注意对于JS,不需要该标识,默认类级别的变量是可以序列化的)
(注意要引用命名空间System)

1.5 CustomEditor 自定义某个组件的检视面板样式

格式:[CustomEditor(typeof(XXXX))],详见“Unity3D编辑器扩展”一文。

2. 方法级标识

2.1 ContextMenu 上下文菜单

这是一个方法级的标识,可以为Inspector脚本中添加一个触发事件,示例代码和截图如下所示。 注意ContextMenu不支持多重路径。

[AddComponentMenu("MyTest/Test")]
public class Test : MonoBehaviour
{
    [ContextMenu("DoLogTest")]
    void DoLogTest()
    {
        Debug.Log("i am function DoLogTest");
    }
    [ContextMenu("ShowName")]
    void ShowName()
    {
        Debug.Log(gameObject.name);
    }
} 

上下文菜单使用示例

2.2 MenuItem 编辑器扩展添加菜单的目录

详见“Unity3D编辑器扩展”一文,需要引用Unity.Editor命名空间,类需要放到Editor目录下。

3. 变量级标识

3.1 HideInInspector Inspector界面隐藏变量的显示

注意变量仍可以被序列化,只是不在Inspector界面显示而已。

3.2 NonSerialized 不被序列化

不序列化变量,且不显示在检视面板中。(注意要引用命名空间System)

3.3 SerializeField 私有变量序列化

该标识可以将私有变量(所有继承自UnityEngine.Object的类,如GameObject,Component,MonoBehaviour,Texture2D,AnimationClip;所有基本类型,如int,string,float,bool;一些内建类型,如Vector2,Vector3,Quaternion,Color,Rect,Layermask;序列化类型的Array,序列化类型的List;枚举Enum)序列化,使得在检视面板内可以重新设置变量的值,虽然检视面板可见,但仍然是私有变量。
注意该标识不可以序列化静态变量,也不能序列化属性。

3.4 ContextMenuItem

可以为变量(public)添加右键弹出命令,从而执行相关的操作。
该标识接受两个变量,1个是display name,一个是右键弹出菜单点击后的方法。
如下述代码和截图所示:

public class Test : MonoBehaviour
{
    [ContextMenuItem("Random Age", "RandomAge")]
    public int Age;
    void RandomAge()
    {
        Age = new System.Random(DateTime.Now.Millisecond).Next(1, 100);
    }

    [ContextMenuItem("Random Name", "RandomName")]
    public string Name;
    private void RandomName()
    {
        string[] names = new string[] { "Jack", "Jim", "Tomas", "Han", "Ann" };
        Name = names[new System.Random(DateTime.Now.Millisecond).Next(0, 4)];
    }
}

ContextMenuItem标识实现的效果

3.5 Range/RangeAttribute 变量范围限定

[Range(min,max)]或者[RangeAttribute(min,max)]可以对变量的输入范围进行限定,使得Inspector检视面板内的数值输入框变成Slider,且范围为(min,max)。