整理一些常用的Unity Attribute。
Unity提供两类Attribute:
- UnityEngine: 主要作用于Inspector面板,参阅文档 AddComponentMenu 及其同级页面。
- UnityEditor: 主要作用于Unity编辑器(例如菜单),参阅文档 CallbackOrderAttribute 及其同级页面。
1. UnityEngine常用Attribute
AddComponentMenu: 作用于脚本中的类,可在“Component”菜单中的任意位置放置脚本,而不仅是“Component > Scripts”菜单。
DisallowMultipleComponent: 作用于脚本中的类,指定类(及其子类)不能多次添加到GameObject。
RequireComponent: 作用于脚本中的类,添加到GameObject时自动添加依赖项。
ExecuteAlways: 作用于脚本中的类,使脚本实例在编辑时也能执行。
ExecuteInEditMode: 此属性逐步被淘汰,使用 ExecuteAlways 代替。
HideInInspector: 作用于变量,使变量不显示在 Inspector 中,但会进行序列化。
SerializeField: 作用于变量,强制对私有变量进行序列化,并在 Inspector 中显示。
Header: 作用于变量,在变量上方添加标题,可用来分组。
Space: 作用于变量,添加字段间距。
TextArea: 作用于变量,带滚动条的文本输入框。
Multiline: 作用于变量,不带滚动条的多行文本输入框。
Range: 作用于变量,限定 float 或 int 的取值范围。
Tooltip: 作用于变量,为字段添加提示信息,鼠标悬停字段上即可展示。
ContextMenuItem: 作用于变量,对字段添加一个右键菜单,并执行指定的函数。
ContextMenu: 作用于函数,在 Inspector 脚本上下文菜单中添加函数执行命令。【注意】此函数必须是非静态的。
RuntimeInitializeOnLoadMethod: 作用于函数,游戏启动时,会自动调用添加了该属性的方法。
示例程序:
using UnityEngine;
[DisallowMultipleComponent]
[RequireComponent(typeof(Rigidbody))]
[AddComponentMenu("Snippet/Test/UnityEngineAttributeTest")]
[ExecuteAlways]
public class UnityEngineAttributeTest : MonoBehaviour
{
// 控制可见性
[HideInInspector]
public bool isHide;
[SerializeField]
private float hp = 10;
#region 辅助特性
// 1.Header: 分组说明特性
// 为成员分组
// [Header("分组说明")]
[Header("基础属性")]
public int age;
public bool sex;
[Header("战斗属性")]
public int atk;
public int def;
// 2.Tooltip: 悬停注释
// 为变量添加说明
// [Tooltip("注释内容")]
[Tooltip("闪避")]
public int miss;
// 3.Space: 间隔特性
// 让两个字段间出现间隔
// [Space()]
[Space()]
public int space;
// 4.Range: 修饰数值的滑条范围
// [Range(最小值, 最大值)]
[Range(0, 10)]
public float luck;
// 5.Multiline: 多行显示字符串,默认不写参数显示3行
// 写参数就是对应行
// [Multiline(5)]
[ContextMenuItem("Reset", "ResetMultiline")]
[Multiline()]
public string multiline;
private void ResetMultiline() {
multiline = "";
}
// 6.TextArea: 滚动条显示字符串,默认不写参数就是超过3行显示滚动条
// [TextArea(4, 5)]
// 最少显示4行,最多5行,超过5行就显示滚动条
[TextArea(4, 5)]
public string notice;
// 7.ContextMenuItem
// 参数1 显示按钮名
// 参数2 方法名,不能带参数
// [ContextMenuItem("按钮名", "方法名")]
[ContextMenuItem("重置金币", "ResetCoin")]
public int coin;
private void ResetCoin() {
coin = 100;
}
// 8.ContextMenu: 为方法添加特性,能够在Inspector中执行
// [ContextMenu("测试函数")]
[ContextMenu("清空公告内容")]
private void ResetNotice() {
notice = "";
}
#endregion
[ContextMenu("DecreaseHp")]
private void DecreaseHp()
{
if (hp > 0)
{
hp--;
}
}
[RuntimeInitializeOnLoadMethod]
static void OnRuntimeLoad()
{
Log.info("OnRuntimeLoad", LogColor.Red);
}
}
点击脚本上下文菜单中的 DecreaseHp 就会执行脚本中的 DecreaseHp 函数,Hp数值就会减1。
点击multiline字段右键上下文菜单中的Reset,执行脚本中的 ResetMultiline 函数,清空 multiline 字段。
2. UnityEditor常用Attribute
MenuItem: 向Unity编辑器主菜单或面板上下文菜单添加菜单项。
InitializeOnLoad: Unity加载或重新编译脚本时,会调用带有此属性的静态构造函数。
InitializeOnLoadMethod: 作用于函数,InitializeOnLoad的Method版本。【注意】此函数必须是静态的。
示例程序:
using UnityEditor;
[InitializeOnLoad]
public class UnityEditorAttributeTest
{
static UnityEditorAttributeTest()
{
EditorApplication.update += Update;
Log.info("UnityEditorAttributeTest: Constructor", LogColor.Red);
}
// 添加到编辑器菜单中
[MenuItem("MyMenu/ Do Something")]
static void DoSomething()
{
Log.info("Doing Something...");
}
static void Update()
{
Log.info("UnityEditorAttributeTest: Update", LogColor.Red);
}
[InitializeOnLoadMethod]
static void InitializeOnLoad() {
Log.info("InitializeOnLoad");
}
}