unity 常用/有用attributes
举两个例子,在变量上使用[SerializeFiled]属性,可以强制让变量进行序列化,可以在统一的编辑器上进行赋值。
在类上使用[RequireComponent]属性,就会在类的游戏物体上自动追加所需的组件。
以下是统一官网文档中找到的所有属性,下面将按照顺序,逐个对这些属性进行说明和小的测试。
部分例子使用了统一官方的示例。
UnityEngine
AddComponentMenu
可以在UnityEditor的组件的菜单中增加自定义的项目。菜单可以设置多级,使用斜线/分隔即可。在层次中选中游戏物体的时候,点击该菜单项,就可以在游戏物体上追加该部件。
例如如下代码可以完成下图的效果。
[AddComponentMenu( “TestMenu / TestComponet”)] 公共类TestMenu:MonoBehaviour { }
AssemblyIsEditorAssembly
汇编级属性,使用该属性的类会被认为是EditorClass。具体用法不明。
上下文菜单
可以在督察的文本菜单中增加选项。
例如,如下代码的效果
公共类TestMenu:MonoBehaviour { [ContextMenu(“做点什么”)] void DoSomething(){ Debug.Log(“执行操作”); } }
ContextMenuItemAttribute
这个属性是Unity4.5之后提供的新功能,可以在检查上面对变量追加一个右键菜单,并执行指定的函数。
例子:
公开课示例:MonoBehaviour { [ContextMenuItem(“Reset”,“ResetName”)] public string name =“Default”; void ResetName(){ name =“Default”; } }
DisallowMultipleComponent
对一个MonoBehaviour的子类使用这个属性,那么在同一个游戏物体上面,最多只能添加一个该类别的实例。
尝试添加多个的时候,会出现下面的提示。
ExecuteInEditMode
默认状态下,MonoBehavior中的开始,更新,OnGUI等方法,需要在播放的状态下才会被执行。
这个属性让类在编辑器模式(非播放模式)下也能执行。
但是与播放模式也有一些区别。
例如:
Update方法只在Scene编辑器中有物体产生变化时,才会被调用。OnGUI
方法只在GameView接收到事件时,才会被调用。
HeaderAttribute
这个属性可以在督察中变量的上面增加部首。
例子:
公共类ExampleClass:MonoBehaviour { [页眉( “生命值”)] public int CurrentHP = 0; public int MaxHP = 100; [页眉( “魔法值”)] public int CurrentMP = 0; public int MaxMP = 0; }
HideInInspector
在变量上使用这个属性,可以让公众的变量在检查上隐藏,也就是无法在编辑器中进行编辑。
ImageEffectOpaque
在OnRenderImage上使用,可以让渲染顺序在非透明物体之后,透明物体之前。
例子
[ImageEffectOpaque] void OnRenderImage(RenderTexture源,RenderTexture目标){ }
ImageEffectTransformsToLDR
渲染从从HDR变为LDR具体使用方法不明。
MultilineAttribute
在字符串类型上使用,可以在编辑器上输入多行文字。
公共类TestString:MonoBehaviour { [MultilineAttribute] public string mText; }
NotConvertedAttribute
在变量上使用,可以指定该变量在建立的时候,不要转换为目标平台的类型。
NotFlashValidatedAttribute
在变量上使用,在Flash平台上构建的时候,对该变量不进行类型检查
。Unity5.0中已经移除了这个属性。
NotRenamedAttribute
禁止对变量和方法进行重命名
。Unity5.0中已经移除了这个属性。
PropertyAttribute
RangeAttribute
在INT或者浮子类型上使用,限制输入值的范围
公共类TestRange:MonoBehaviour { [范围(0,100)] public int HP; }
RequireComponent
在类上使用,添加对另一个组件的依赖。
当该级被添加到一个游戏物体上的时候,如果这个游戏物体不含有依赖的组件,会自动添加该成分。
且该及部件不可被移除。
例子
[RequireComponent(typeof运算(刚体))] 公共类TestRequireComponet:MonoBehaviour { }
如果尝试移除被依赖的组件,会有如下提示
RPC
在方法上添加该属性,可以网络通信中对该方法进行RPC调用。
[RPC] void RemoteMethod(){ }
RuntimeInitializeOnLoadMethodAttribute
此属性仅在Unity5上可用。
在游戏启动时,会自动调用添加了该属性的方法。
类MyClass { [RuntimeInitializeOnLoadMethod] static void OnRuntimeMethodLoad() { Debug.Log(“游戏已加载并正在运行”); } }
SelectionBaseAttribute
当一个游戏物体含有使用了该属性的组件的时候,在SceneView中选择该游戏物体,层次上面会自动选中该游戏对象的父。
SerializeField
在变量上使用该属性,可以强制该变量进行序列化。即可以在编辑上对变量的值进行编辑,即使变量是私有的也可以。
在UI开发中经常可见到对私人的组件进行强制序列化的用法。
例子
公共类TestSerializeField:MonoBehaviour { [SerializeField] 私人字符串名称; [SerializeField] 私人按钮_button; }
SharedBetweenAnimatorsAttribute
用于StateMachineBehaviour上,不同的动画将共享这一个StateMachineBehaviour的实例,可以减少内存占用。
SpaceAttribute
使用该属性可以在Inspector上增加一些空位。例子:
公共类TestSpaceAttributeByLvmingbei:MonoBehaviour { public int nospace1 = 0; public int nospace2 = 0; [空间(10)] public int space = 0; public int nospace3 = 0; }
TextAreaAttribute
该属性可以把串在检查上的编辑区变成一个文本区域。
例子:
公共类TestTextAreaAttributeByLvmingbei:MonoBehaviour { [文本区] public string mText; }
TooltipAttribute
这个属性可以为变量上生成一条提示,当鼠标指针移动到检查员上时候显示。
公共类TestTooltipAttributeByLvmingbei:MonoBehaviour { [Tooltip(“今年是2015!”)] public int year = 0; }
UnityAPICompatibilityVersionAttribute
用来声明API的版本兼容性
UnityEngine.Serialization
FormerlySerializedAsAttribute
该属性可以令变量以另外的名称进行序列化,并且在变量自身修改名称的时候,不会丢失之前的序列化的值。
例子:
使用UnityEngine; 使用UnityEngine.Serialization; 公共类MyClass:MonoBehaviour { [FormerlySerializedAs( “myvalue的”)] 私人字符串m_MyValue; 公共字符串myValue { 得到{return m_MyValue; } 设置{m_MyValue = value; } } }
UnityEngine.Editor
该包为编辑器开发专用
CallbackOrderAttribute
定义回调的顺序
CanEditMultipleObjects
编辑同时编辑多个组件的功能
CustomEditor
声明一个类为自定义编辑器的类
CustomPreviewAttribute
将一个类标记为指定类型的自定义预览
Unity4.5提供以后新的功能
例子:
[CustomPreview(typeof运算(游戏物体))] 公共类MyPreview:ObjectPreview { public override bool HasPreviewGUI() { 返回true; } public override void OnPreviewGUI(Rect r,GUIStyle background) { GUI.Label(r,target.name +“正在预览”); } }
CustomPropertyDrawer
标记自定义PropertyDrawer时候使用。
当自己创建一个PropertyDrawer或者DecoratorDrawer的时候,使用该属性来标记。TODO:如何创建属于自己的Attribute
DrawGizmo
可以在场景视图中显示自定义的Gizmo
下的例子,是在场景视图中,当挂有MyScript的GameObject被选中,且距离相距离超过10的时候,显示自定义的
Gizmo。Gizmo的图片需要放入资产/小玩意儿目录中。
例子:
使用UnityEngine; 使用UnityEditor; 公共类MyScript:MonoBehaviour { } 公共类MyScriptGizmoDrawer { [DrawGizmo(GizmoType.Selected | GizmoType.Active)] 静态void DrawGizmoForMyScript(MyScript scr,GizmoType gizmoType){ Vector3 position = scr.transform.position; if(Vector3.Distance(position,Camera.current.transform.position)> 10f) Gizmos.DrawIcon(位置,“300px-Gizmo.png”); } }
InitializeOnLoadAttribute
在类上使用,可以在统一启动的时候,运行编辑器脚本。
需要该类拥有静态的构造函数。
做一个创建一个空的游戏对象的例子。
例子:
使用UnityEditor; 使用UnityEngine; [InitializeOnLoad] 类MyClass { 静态MyClass() { EditorApplication.update + =更新; Debug.Log(“启动并运行”); } 静态无效更新() { 的debug.log( “更新”); } }
InitializeOnLoadMethodAttribute
在Method上使用,是InitializeOnLoad的Method版本。
方法必须是static的。
菜单项
在方法上使用,可以在Editor中创建一个菜单项,点击后执行该方法,可以利用该属性做很多扩展功能。需要方法为static。
例子:
使用UnityEngine; 使用UnityEditor; 使用System.Collections; 公共类TestMenuItem:MonoBehaviour { [MenuItem(“MyMenu / Create GameObject”)] public static void CreateGameObject(){ 新的GameObject(“lvmingbei的GameObject”); } }
PreferenceItem
使用该属性可以定制统一的偏好界面。
在这里就使用官方的例子:
使用UnityEngine; 使用UnityEditor; 使用System.Collections; 公共类OurPreferences { //我们是否已经加载了首选项 private static bool prefsLoaded = false; //首选项 public static bool boolPreference = false; //将名为“我的偏好”的偏好设置添加到偏好设置窗口中 [PreferenceItem(“我的首选项”)] public static void PreferencesGUI(){ //加载首选项 如果(!prefsLoaded){ boolPreference = EditorPrefs.GetBool(“BoolPreferenceKey”,false); prefsLoaded = true; } //首选项GUI boolPreference = EditorGUILayout.Toggle(“Bool Preference”,boolPreference); //保存首选项 如果(GUI.changed) EditorPrefs.SetBool(“BoolPreferenceKey”,boolPreference); } }
UnityEditor.Callbacks
这个包中是三个回调的属性,都需要方法为静态的。
OnOpenAssetAttribute
在打开一个资产后被调用。
例子:
使用UnityEngine; 使用UnityEditor; 使用UnityEditor.Callbacks; 公共类MyAssetHandler { [OnOpenAssetAttribute(1)] 公共静态布尔步骤1(INT实例ID,INT行){ 字符串名称= EditorUtility.InstanceIDToObject(instanceID).name; Debug.Log(“Open Asset step:1(”+ name +“)”); 返回false; //我们没有处理公开 } // step2具有索引为2的属性,因此将在step1之后调用 [OnOpenAssetAttribute(2)] public static bool step2(int instanceID,int line){ Debug.Log(“Open Asset step:2(”+ instanceID +“)”); 返回false; //我们没有处理公开 } }
PostProcessBuildAttribute
该属性是在建设完成后,被调用的回调。
同时具有多个的时候,可以指定先后顺序。
例子:
使用UnityEngine; 使用UnityEditor; 使用UnityEditor.Callbacks; 公共类MyBuildPostprocessor { [PostProcessBuildAttribute(1)] 公共静态无效OnPostprocessBuild(BuildTarget目标,字符串pathToBuiltProject){ Debug.Log(pathToBuiltProject); } }
PostProcessSceneAttribute
使用该属性的函数,在现场被构建之前,会被调用。
具体使用方法和PostProcessBuildAttribute类似。