Unity 中常用特性(Attribute)总结(上篇)
内容取自官方API文档特性说明部分,用于开发参考,辅助开发提升开发效率。
特性(Attribute)作用于脚本中的类、变量或方法的上,用[ ]包裹,用于表明其特殊行为,如 [HideInInspector],使变量在 Inspector 面板隐藏;
此系列不讨论 UnityEditor 命名空间下的特性。如有需要,请查阅官方文档。
部分特性还未使用过,且网上资料很少,所以欠缺解释,后期补足。
此篇为此系列的上篇。包含 System 命名空间下的特性和 UnityEngine 命名空间下的 A - H 部分。
System命名空间下
Serializable
描述
标志着一个类或结构可以被序列化。
注意:只能序列化非抽象、非通用的自定义类。
示例代码
在下面的示例中,我们创建了一个自定义 Player 结构并为其赋予 [Serializable] 属性以使其可序列化。然后我们创建一个 Player 类型的私有字段并将 [SerializeField] 属性应用于它以使其显示在 Inspector 中。
public class Player : MonoBehaviour
{
//创建一个自定义结构并将 [Serializable] 应用到它
[Serializable]
public struct PlayerStats
{
public int movementSpeed;
public int hitPoints;
public bool hasHealthPotion;
}
//使我们的 PlayerStats 结构的私有字段在检查器中可见通过对其应用 [SerializeField] 属性
[SerializeField]
private PlayerStats stats;
}
NonSerialized
描述
标志着一个变量不可以被序列化。
通过这种方式,您可以保持变量为 public 状态,并且 Unity 不会尝试对其进行序列化或在 Inspector 中显示它。
与 HideInInspector 的差别
[HideInInspector] 只是隐藏,但变量仍会序列化。
示例代码
class Test
{
// p 不会被序列化,当然也不会显示在 Inspector 窗口。
[System.NonSerialized]
public int p = 5;
}
UnityEngine命名空间下
AddComponentMenu
描述
AddComponentMenu 属性允许您将脚本放置在“组件(Component)”菜单中的任何位置。
重要提示:使用此特性后,需要重新启动以使其生效。
用法
AddComponentMenu(string menuName)
或
AddComponentMenu(string menuName, int order)
可接受的参数
1.string menuName:菜单中组件的路径。
2.int order:顺序。确定此菜单项在“组件”菜单中的位置(从低到高)。
示例代码
[AddComponentMenu("Transform/Follow Transform", 1)]
public class FollowTransform : MonoBehaviour
{
}
AssemblyIsEditorAssembly
描述
程序集级别属性。具有此属性的程序集中的任何类都将被视为编辑器类。
用法
AssemblyIsEditorAssembly
BeforeRenderOrder
描述
当您需要为 Application.onBeforeRender 指定自定义回调顺序时,请使用此 BeforeRenderOrderAttribute。
Application.onBeforeRender将重新排序所有注册的事件接收器,并根据此属性从最低到最高的顺序调用它们。没有属性代表 0 的阶数。
用法
BeforeRenderOrder(int order)
可接受的参数
1.排序顺序,从低到高排序。
ColorUsage
描述
用于颜色变量,可通过可视化窗口配置此颜色。
用法
ColorUsage(bool showAlpha)
或
ColorUsage(bool showAlpha, bool hdr)
或(过时)
ColorUsage(bool showAlpha, bool hdr, float minBrightness, float maxBrightness, float minExposureValue, float maxExposureValue)
可接受的参数
1.是否显示透明度。
2.是否使用 HDR 模式。
3.最小亮度(过时)
4.最大亮度(过时)
5.最小曝光(过时)
6.最大曝光(过时)
警告:
亮度和曝光是过时参数,写了也不会有作用。
示例代码
[ColorUsage(true,true)]
public Color c;
ContextMenu
描述
给***脚本***右键菜单添加一个自定义方法,不能是静态的。
用法
ContextMenu(string itemName)
或
ContextMenu(string itemName, bool isValidateFunction)
或
ContextMenu(string itemName, bool isValidateFunction, int priority)
可接受的参数
1.string itemName:菜单项的名称。
2.bool isValidateFunction:这是否是验证函数(默认为 false)。
3.int priority:用于覆盖菜单项排序的优先级(默认为 1000000)。数字越小,它在菜单中出现的时间就越早。
示例代码
public class ContextTesting : MonoBehaviour
{
// 在附加脚本的检查器中添加一个名为“Do Something”的上下文菜单.
[ContextMenu("Do Something")]
void DoSomething()
{
Debug.Log("Perform operation");
}
}
ContextMenuItem
描述
给***字段***右键菜单添加一个自定义方法,不能是静态的。
用法
ContextMenuItem(string name, string function)
可接受的参数
1.string name:菜单项的名称。
2.string function:调用的函数的名称。
示例代码
此代码,可以让您在右键点击 playerBiography 字段时,显示 Reset 菜单项,此菜单项将调用 ResetBiography 方法。
public class Example : MonoBehaviour
{
[ContextMenuItem("Reset", "ResetBiography")]
[Multiline(8)]
string playerBiography = "";
void ResetBiography()
{
playerBiography = "";
}
}
CreateAssetMenu
描述
将 ScriptableObject 子类标记为自动在 Assets/Create 子菜单中列出,以便可以轻松创建该类型的实例并将其作为“.asset”文件存储在项目中。
用法
可接受的参数
1.string fileName:新创建的此类实例使用的默认文件名。(必需参数)
2.string menuName:Assets/Create菜单中显示的此类型的显示名称。(必需参数)
3.int order:菜单项在 Assets/Create 菜单中的位置。(可选参数)
示例代码
[(fileName = "MyAsset/Test", menuName = "MyAssetScript")]
public class Example : MonoBehaviour
{
}
CustomGridBrush
描述
将类定义为网格画笔并使其在调色板窗口中可用的属性。
用法
CustomGridBrush
或
CustomGridBrush(bool hideAssetInstances, bool hideDefaultInstance, bool defaultBrush, string defaultName)
可接受的参数
1.bool hideAssetInstances:在平铺调色板窗口中隐藏此画笔的所有资产实例。
2.bool hideDefaultInstance:在平铺调色板窗口中隐藏画笔的默认实例。
3.bool defaultBrush:如果设置为 true,则笔刷将替换 Unity 内置笔刷作为调色板窗口中的默认笔刷。
4.string defaultName:此画笔的默认实例的名称。
Delayed
描述
用于使脚本中的 float、int 或 string 变量延迟的属性。
使用此属性时,在检视面板对浮点、整数或文本字段的修改不会立即生效,直到用户按下 Enter 键或焦点从字段移开。
用法
Delayed
DisallowMultiple
描述
防止将同一类型(或子类型)的 MonoBehaviour 多次添加到游戏对象中。
用法
DisallowMultiple
ExcludeFromObjectFactory
描述
将此属性应用到类以防止使用 ObjectFactory 方法创建该类及其继承的类。
ObjectFactory 简述
使用 DefaultObject 在编辑器中创建一个新的 UnityEngine.Object。
用法
ExcludeFromObjectFactory
ExcludeFromPreset
描述
将此属性应用到类以防止从类的实例创建预设。
用法
ExcludeFromPreset
ExecuteAlways
描述
使脚本的实例始终执行,无论是作为播放模式的一部分还是在编辑时。
用法
ExecuteAlways
示例代码
[ExecuteAlways]
public class ExampleClass : MonoBehaviour
{
void Start()
{
if (Application.IsPlaying(gameObject))
{
// Play 逻辑
}
else
{
// Editor 逻辑
}
}
}
ExecuteInEditMode(正在逐步淘汰)
描述
使脚本的所有实例在编辑模式下执行。
此属性正在逐步淘汰,因为它不考虑预制模式。
为了表明 MonoBehaviour 正确地考虑了预制模式并且在播放模式下在预制模式下打开是安全的,可以使用属性 ExecuteAlways 代替这里的属性。
用法
ExecuteInEditMode
示例代码
[ExecuteInEditMode]
public class PrintAwake : MonoBehaviour
{
void Awake()
{
Debug.Log("编辑器导致此唤醒");
}
void Update()
{
Debug.Log("编辑器导致此更新");
}
}
GradientUsage
描述
将此特性应用于 Gradient 类型的字段,可以在编辑器中用 GUI 配置变量。
用法
GradientUsage(bool hdr, ColorSpace colorSpace)
GUITarget
描述
选择在哪些 Display 上调用 OnGUI 函数。(Game 窗口下可切换 Display)
用法
GUITarget
或
GUITarget(int displayIndex)
或
GUITarget(int displayIndex, int displayIndex1)
或
GUITarget(int displayIndex, int displayIndex1, params int[] displayIndexList)
可接受的参数
1.int displayIndex:Display 索引。
2.int displayIndex1:Display 索引。
3.params int[] displayIndexList:Display 索引列表。
无参将显示在所有可用 Display 上。
示例代码
// 选择在 Display 0 和 Display 1 上显示。
[GUITarget(0,1)]
void OnGUI()
{
}
Header
描述
在 Inspector 中的某些字段上方添加标题。
用法
Header(string header)
可接受的参数
1.string header:标题文本。
示例代码
public class Example : MonoBehaviour
{
[Header("Health Settings")]
public int health = 0;
public int maxHealth = 100;
[Header("Shield Settings")]
public int shield = 0;
public int maxShield = 0;
}
HelpURL
描述
为类提供自定义文档 URL。
用法
HelpURL(string url)
可接受的参数
1.string url:此类的自定义文档 URL。
示例代码
[HelpURL("http://example.com/docs/MyComponent.html")]
公共类 MyComponent
{
}
HideInInspector
描述
使变量不显示在 inspector 中但被序列化。
用法
HideInInspector
示例代码
public class Example : MonoBehaviour
{
// 使变量 p 不显示在检查器中
// 但被序列化。
[HideInInspector]
int p = 5;
}
.Net 库中的其他特性
.NET 库中还定义了一些属性,这些属性有时可能在 Unity 代码中有用。有关详细信息,请参阅Microsoft 关于属性的文档。
注意:不要使用 .NET 库中定义的 ThreadStatic 属性;如果将其添加到 Unity 脚本中,则会导致崩溃。
本文参考的文章
Unity 特性(Attribute)总览
Attributes(Unity 官方文档)
Unity手册—Attribute汇总说明