Unity特性

156 阅读6分钟

System命名空间下

Serializable:序列化一个类,作为一个子属性显示在监视面板。

public class Test : MonoBehaviour
{
    public int num;
    public bool isOn;

    public Test1 test1;
}
[Serializable]
public class Test1
{
    public int n;
    public bool isOn;
}

image.png

NonSerialized:反序列化一个变量,并且在监视版上隐藏。

public class Test : MonoBehaviour
{
    [NonSerialized]
    public int num;
    public bool isOn;
}

image.png

UnityEngine命名空间下

AddComponentMenu:可以添加一个组件菜单项到编辑器里。

[AddComponentMenu("MyTest/Test1",1)]
public class Test : MonoBehaviour
{
}

image.png

ContextMenu:给脚本右键菜单添加一个自定义方法,不能是静态的。编辑模式下使用。

点击脚本右键属性会添加自定义的方法,点击方法就会执行。

public class Test : MonoBehaviour
{
    [ContextMenu("Do Nothing")]
    void DoTest()
    {
        Debug.Log("Test");
    }
}

image.png

ContextMenuItem:给字段右键菜单添加一个自定义方法,不能是静态的。

public class Test : MonoBehaviour
{
    //参数1:添加菜单名称,2:调用的方法
    [ContextMenuItem("Test", "DoTest")]
    public string str = "";

    void DoTest()
    {
        str = "Test";
    }
}

image.png

image.png

image.png

CreateAssetMenu:

用于ScriptableObject的子类,将这个类(相当于资源文件添加到Asset菜单项中),关于ScriptableObject具体可以看这位大神的Blog。

1、Asset菜单多了自定义资源文件

2、点击后添加在自定义路径(必需已经存在):现在Assets文件夹下创建MyAsset文件夹,点击创建后

[CreateAssetMenu(fileName ="Assets/MyAsset/Test",menuName="MyAssetScript")]
public class Test : ScriptableObject
{
   
}

image.png

image.png

Header:标题特性,给监视版加一个小标题。

public class Test : MonoBehaviour
{
    [Header("数字")]
    public int num;
}

image.png

HelpURL:给类提供一个自定义文档URL。如图可以按Ctrl+鼠标左键跳转到目标。

[HelpURL("http://www.baidu.com")]
public class Test : MonoBehaviour
{
   
}

HideInInspector:只是隐藏变量在监视板里,不改变序列化属性。

public class Test : MonoBehaviour
{
    [HideInInspector]
    public int num1;
    public int num2;
}

image.png

Multiline:可以让string变量在监视板上多加几行。

public class Test : MonoBehaviour
{
    [Multiline(10)]
    public string str;
}

image.png

Range:在监视面板限制int或float类型变量值。但有个BUG,看右边代码,所以个人建议还是用属性(Property)配合Mathf.Clamp使用来限制数值大小。

public class Test : MonoBehaviour
{
    [Range(0,10)]
    public int num;
}

image.png

RequireComponent:自动添加需要的组件。若已存在则不额外添加。这样脚本就可以安全的使用该组件。添加组件后,自动添加typeof内的组件,若有则不添加。

[RequireComponent(typeof(Rigidbody))]
public class Test : MonoBehaviour
{
    
}

image.png

SerializeField:序列化字段,主要用于序列化私有字段。

public class Test : MonoBehaviour
{
    [SerializeField]
    private int num;
}

image.png

Space:用于在监视板上加空行。

public class Test : MonoBehaviour
{    
    public int num;
    [Space(10)]
    public int num1;
}

image.png

TextArea:让string在监视板上显示成带滚动条的文本域。

public class Test : MonoBehaviour
{   //默认显示3行,超出自动显示滚动条
    [TextArea]
    public string str;
    //最少显示2行,最多显示5行,大于5行。会自动显示滚动条
    [TextArea(2,5)]
    public string str1;
}

image.png

Tooltip:给监视板的字段添加小贴士。及鼠标指向字段显示的提示。

public class Test : MonoBehaviour
{
    [Tooltip("这是提示")]
    public int num;
}

image.png

ColorUsage:可以修改Color的配置,是否显示Alpha通道,或者使用HDR模式。

public class Test : MonoBehaviour
{
    //参数
    //1:是否显示透明度(Alpha)
    //2:是否用HDR模式    
    [ColorUsage(false, true)]   
    public Color color;
}

image.png

Delayed:用于float、int、或string变量,只有按了回车或焦点离开字段才会返回新值。

public class Test : MonoBehaviour
{
    [Delayed]
    public int num;
    public Text text;

    private void Update()
    {
        text.text = num.ToString();
    }
}

image.png

AssemblyIsEditorAssembly

汇编级别的属性。带了这个属性的类就被认为是编辑器类。只能对于程序集有效,具体怎么用不知道呢,网上也没找到用法。

DisallowMultipleComponent:用于MonoBehaviour或其子类,不能重复添加这个类的组件,重复添加会弹出对话框。

[DisallowMultipleComponent]
public class Test : MonoBehaviour
{
    
}

image.png

ExecuteInEditMode:

带了这个特性的实例会直接在编辑模式下就执行,但不是像进入游戏模式那样时刻执行:1、Update在这个场景中任意物体变化了执行;2、OnGUI在Game View接收到一个Event时执行;3、OnRenderObject和其他渲染回调函数在Scene View 或 Game View重新渲染时执行。

GUITarget:选择哪些显示器调用OnGUI函数。

public class Test : MonoBehaviour
{
    //选择显示器0还有显示器1
    [GUITarget(0, 1)]    
    private void OnGUI()
    {
        GUI.Label(new Rect(10, 10, 300, 300), "Test");
    }
}

image.png

ImageEffectAllowedInSceneView:使用了这个特性的图像特效可以渲染在 SceneView的摄像机上。

ImageEffectOpaque:可以在不透明通道直接执行图像特效。详见Unity圣典: 图像特效脚本。

ImageEffectTransformsToLDR:在HDR渲染模式下,使用图像特效用LDR渲染模式。

ImageEffect这东西在Unity Pro上才有,GG了。

PreferBinarySerialization:只能用于ScriptableObject 子类,用二进制序列化,有利于处理大量数据的资源文件,提升读写性能。主要缺点是二进制的文件我们看不懂,还有不能用版本控制软件合并它。

Property:这个是监视板里面修改样式的抽象基类,例如显示小标题、显示多行编辑文本等等都是以它为基类。

RuntimeInitializeOnLoadMethod:不用作为组件添加到对象也可以直接自动调用初始化方法。要求方法为静态,类、方法可以为私有。当开始游戏就会调用,但有多个这种特性的方法调用顺序是不能确定的。

public class Test : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod]
    static void OnRuntimeMethodLoad()
    {
        Debug.Log("1");
    }
    [RuntimeInitializeOnLoadMethod]
    static void OnSecondRuntimeMethodLoad()
    {
        Debug.Log("1");
    }
}

image.png

SelectionBase:带这个特性的GameObject,如果点击本身就一定选中本身,即便父对象也有这特性;如果子对象没有带这个特性,则当在场景点击子对象时,选中的是带特性的父对象;如果父对象和父父对象都有这特性,选父对象。

[SelectionBase]
public class Test : MonoBehaviour
{
    
}

image.png

SharedBetweenAnimators:用于StateMachineBehaviour,类似prefab,Animator之间公用这个实例,减少内存消耗。

UnityAPICompatibilityVersion:用来声明程序集的API版本,避免处理时是否可以用旧版本的Unity API。

UnityEngine.Serialization命名空间下

[FormerlySerializedAs("taskPrefabs")]//重命名某public或[Serialized]的字段后,会导致引用丢失,在重命名之前加上该标签保存引用则可以避免。

UnityEditor命名空间下

MenuItem:

添加菜单项,必须是静态方法。第二个参数若为true,则会先判断改方法是否返回true,若是,则可以使用,若为false,这按钮是不可用的(灰色的)。更多用法看官网教程这里。

public class Test : MonoBehaviour
{
    [MenuItem("MyMenu/Do Nothing")]
    static void DoNothing()
    {
        Debug.Log("Do Nothing");
    }
}

image.png

CallbackOrder:所有带order(顺序)回调属性的特性基类。

CanEditMultipleObjects:使自定义编辑器支持同编辑多个对象,一般配合CustomEditor使用类。

[CanEditMultipleObjects]
[CustomEditor(typeof(Test))]
public class Test : Editor
{
    public int num;
    public override void OnInspectorGUI()
    {
        Test test = (Test)target;
        test.num = EditorGUILayout.IntField(20);
    }
}

image.png

CustomEditor:要自定义编辑器就要加这个特性。

CustomPreview:添加自定义类型的preview在监视板。

CustomPropertyDrawer:自定义属性渲染,如果要自定义PropertyDrawer或 DecoratorDrawer,要加上这个特性。

DrawGizmo:自定义Gizmo渲染方法任何组件,方法可以定义在任意类而且不用添加到组件,但必须为静态。

InitializeOnLoad:当Unity工程装载时,会自动调用一个类来初始化,这个类必须有静态构造函数。

InitializeOnLoadMethod:同上,只不过这个是调用静方法。

PreferenceItem:给Preference窗口添加菜单项,调用的也是静态方法。例子是官方的。

特性过时:更改为SettingsProvider

public class Test : MonoBehaviour
{
    private static bool prefsLoaded = false;
    public static bool boolPreference = false;

    [SettingsProvider]
    public static void PreferencesGUI()
    {
        if (!prefsLoaded)
        {
            boolPreference = EditorPrefs.GetBool("BoolPreferenceKey", false);
            prefsLoaded = true;
        }
        //绘制开关
        boolPreference = EditorGUILayout.Toggle("Bool Preference", boolPreference);
        if (GUI.changed)
        {
            EditorPrefs.SetBool("BoolPreferenceKey", boolPreference);
        }
    }
}

image.png