unity 常用/有用attributes

举两个例子,在变量上使用[SerializeFiled]属性,可以强制让变量进行序列化,可以在统一的编辑器上进行赋值。
在类上使用[RequireComponent]属性,就会在类的游戏物体上自动追加所需的组件。

以下是统一官网文档中找到的所有属性,下面将按照顺序,逐个对这些属性进行说明和小的测试。
部分例子使用了统一官方的示例。

UnityEngine

AddComponentMenu

可以在UnityEditor的组件的菜单中增加自定义的项目。菜单可以设置多级,使用斜线/分隔即可。在层次中选中游戏物体的时候,点击该菜单项,就可以在游戏物体上追加该部件。
例如如下代码可以完成下图的效果

[AddComponentMenu( “TestMenu / TestComponet”)]
公共类TestMenu:MonoBehaviour {
}

F:ID:lvmingbei:20150406160818p:平纹

AssemblyIsEditorAssembly

汇编级属性,使用该属性的类会被认为是EditorClass。具体用法不明。

上下文菜单

可以在督察的文本菜单中增加选项。
例如,如下代码的效果

公共类TestMenu:MonoBehaviour {
    [ContextMenu(“做点什么”)]
    void DoSomething(){
        Debug.Log(“执行操作”);
    }
}

F:ID:lvmingbei:20150406162538p:平纹

ContextMenuItemAttribute

这个属性是Unity4.5之后提供的新功能,可以在检查上面对变量追加一个右键菜单,并执行指定的函数。
例子:

公开课示例:MonoBehaviour {
    [ContextMenuItem(“Reset”,“ResetName”)]
    public string name =“Default”;
    void ResetName(){
        name =“Default”;
    }
}

F:ID:lvmingbei:20150406164234克:平纹

DisallowMultipleComponent

对一个MonoBehaviour的子类使用这个属性,那么在同一个游戏物体上面,最多只能添加一个该类别的实例。
尝试添加多个的时候,会出现下面的提示。
F:ID:lvmingbei:20150406165035p:平纹

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;
}

F:ID:lvmingbei:20150406171544p:平纹

HideInInspector

在变量上使用这个属性,可以让公众的变量在检查上隐藏,也就是无法在编辑器中进行编辑。

ImageEffectOpaque

在OnRenderImage上使用,可以让渲染顺序在非透明物体之后,透明物体之前。
例子

[ImageEffectOpaque]
void OnRenderImage(RenderTexture源,RenderTexture目标){
}
ImageEffectTransformsToLDR

渲染从从HDR变为LDR具体使用方法不明。

MultilineAttribute

在字符串类型上使用,可以在编辑器上输入多行文字。

公共类TestString:MonoBehaviour {
    [MultilineAttribute]
    public string mText;
}

F:ID:lvmingbei:20150406183813p:平纹

NotConvertedAttribute

在变量上使用,可以指定该变量在建立的时候,不要转换为目标平台的类型。

NotFlashValidatedAttribute

在变量上使用,在Flash平台上构建的时候,对该变量不进行类型检查
。Unity5.0中已经移除了这个属性。

NotRenamedAttribute

禁止对变量和方法进行重命名
。Unity5.0中已经移除了这个属性。

PropertyAttribute
RangeAttribute

在INT或者浮子类型上使用,限制输入值的范围

公共类TestRange:MonoBehaviour
{
    [范围(0,100)] public int HP;
}
RequireComponent

在类上使用,添加对另一个组件的依赖。
当该级被添加到一个游戏物体上的时候,如果这个游戏物体不含有依赖的组件,会自动添加该成分。
且该及部件不可被移除。

例子

[RequireComponent(typeof运算(刚体))]
公共类TestRequireComponet:MonoBehaviour {

}

F:ID:lvmingbei:20150406191049克:平纹
如果尝试移除被依赖的组件,会有如下提示
F:ID:lvmingbei:20150406191137p:平纹

RPC

在方法上添加该属性,可以网络通信中对该方法进行RPC调用。

[RPC]
void RemoteMethod(){
}
RuntimeInitializeOnLoadMethodAttribute

此属性仅在Unity5上可用。
在游戏启动时,会自动调用添加了该属性的方法

类MyClass
{
    [RuntimeInitializeOnLoadMethod]
    static void OnRuntimeMethodLoad()
    {
        Debug.Log(“游戏已加载并正在运行”);
    }
}
SelectionBaseAttribute

当一个游戏物体含有使用了该属性的组件的时候,在SceneView中选择该游戏物体,层次上面会自动选中该游戏对象的父。

SerializeField

在变量上使用该属性,可以强制该变量进行序列化。即可以在编辑上对变量的值进行编辑,即使变量是私有的也可以。
在UI开发中经常可见到对私人的组件进行强制序列化的用法。
例子

公共类TestSerializeField:MonoBehaviour {
    [SerializeField]
    私人字符串名称;

    [SerializeField]
    私人按钮_button;
}

F:ID:lvmingbei:20150406194030p:平纹

SharedBetweenAnimatorsAttribute

用于StateMachineBehaviour上,不同的动画将共享这一个StateMachineBehaviour的实例,可以减少内存占用。

SpaceAttribute

使用该属性可以在Inspector上增加一些空位。例子:

公共类TestSpaceAttributeByLvmingbei:MonoBehaviour {
    public int nospace1 = 0;
    public int nospace2 = 0;
    [空间(10)]
    public int space = 0;
    public int nospace3 = 0;
}

F:ID:lvmingbei:20150407121446p:平纹

TextAreaAttribute

该属性可以把串在检查上的编辑区变成一个文本区域。
例子:

公共类TestTextAreaAttributeByLvmingbei:MonoBehaviour {
    [文本区]
    public string mText;
}

F:ID:lvmingbei:20150407121811p:平纹

TooltipAttribute

这个属性可以为变量上生成一条提示,当鼠标指针移动到检查员上时候显示。

公共类TestTooltipAttributeByLvmingbei:MonoBehaviour {
    [Tooltip(“今年是2015!”)]
    public int year = 0;
}

F:ID:lvmingbei:20150407122412p:平纹

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”);
    }
    
}

F:ID:lvmingbei:20150410162651p:平纹

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”);
    }
}

F:ID:lvmingbei:20150412204353克:平纹

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);
    }
}

F:ID:lvmingbei:20150412210832p:平纹

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类似。

猜你喜欢

转载自blog.csdn.net/u010889653/article/details/79761169