Unity 中的属性 Attributes 整理

Attributes 属性属于 U3D 的 RunTimeClass,所以加上以下的命名空间是必须的了。其它倒没什么需要注意的。本文将所有运行属性过一遍罢了。

1
2
using UnityEngine;
using System.Collections;

1. AddComponentMenu 添加组件菜单

这函数只是起方便用,原本的脚本(组建)都会在“Component/Script”菜单下,在类之前声明一下这个,它便可以出现在”Componet”菜单下的任何位置。说明指的是要重启U3D才能显示,不过测试貌似直接可以显示。

1
2
3
4
[AddComponentMenu("MyPhysic/PhysicType")]
public class PhysicType: MonoBehaviour
{
}

2. ContextMenu 上下文菜单

这个译名我觉得很不自然,其实上下文算是啥东西……这个函数是在Inspector的脚本中加一个触发事件,就是删除脚本重置脚本按钮的那个小拉菜单中,具体很难说清位置,所以我截了个图。

1
2
3
4
5
6
7
public class Attributes : MonoBehaviour {
[ContextMenu("Hello World!")]
void HelloWorld()
{
Debug.Log("Hello World!");
}
}

3. ExecuteInEditMode 在Editor模式下运行

跟名字一样,在编辑器中运行。不过有三种函数的调用方式。

a- “Update()” is only called when something in the scene changed.

b- “OnGUI()” is called when the Game View recieves an Event.

c- “OnRenderObject()” and the other rendering callback functions are called on every repaint of the Scene View or Game View.

1
2
3
4
5
6
7
8
9
10
[ExecuteInEditMode]
public class ExecuteInEditModeTest: MonoBehaviour
{
private Vector3 vec_Rotation = new Vector3(0.0f, 0.5f, 0.0f);
//Rotate all the time
void OnRenderObject()
{
transform.Rotate(vec_Rotation);
}
}

4. HideInInspector 在检视面板中隐藏

1
2
3
4
5
6
7
8
9
10
11
12
public class HideInspectorTest : MonoBehaviour 
{

[HideInInspector]

public Transform m_Target;
void Start()
{
m_Target = GameObject.Find("test").transform;
}

}

5. RequireComponent 必须要有相应的组建

加入一个组建之前必须存在另一个相应的组建,若没有则自动创建。这个在项目中非常有必要用到,尤其是项目人员比较多的时候(大于三四个)。

1
2
3
4
5
6
[RequireComponent (typeof (Rigidbody))]
public class RequireComponentTest : MonoBehaviour {
void FixedUpdate() {
rigidbody.AddForce(Vector3.up);
}
}

6. NonSerialized 不被序列化

不被序列化该变量,且不显示在检视面板中。

1
2
3
4
public class Test {
[System.NonSerialized]
public int i_Helloword = 5;
}

7. Serializable 可序列化

这个属性可以让子类(继承类)的变量属性显示在检视面板中,也能序列化它。(JS的话完全不需要这个属性。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//SerializableTest.cs
[System.Serializable]
public class SerializableTest
{
public int p = 5;
public Color c = Color.white;
}

//SerializableTest2.cs
public class SerializableTest2 : MonoBehaviour
{
public SerializableTest test;

}

8. SerializeField 序列化域(强制序列化)

这里写得比较清楚,可以将私有变量序列化,将U3D的内建变量序列化等。
https://docs.unity3d.com/ScriptReference/SerializeField.html

本文参考:http://blog.sina.com.cn/s/blog_5b6cb9500101857b.html