使用C#特性的Unity技巧

163 阅读1分钟

解决变量重命名后 unity 的 inspector 中的引用值丢失的问题

using UnityEngine.Serialization;

class Test
{
    [FormerlySerializedAs("m_OldName")]
    public int m_NewName; // m_OldName 为修改前的名字
}

在编辑模式下执行脚本

using UnityEditor;

[ExecuteInEditMode]
class Test
{
    
}

禁止添加多个脚本在同一物体上

using UnityEditor;

[DisallowMultipleComponent]
class Test
{
    
}

提示方法已经过时

using System;

class Test
{
    [Obsolete("Use NewMethod instead")]
    public void OldMethod()
    {
        
    }

    public void NewMethod()
    {
        
    }
}

物体有多个子物体,点击子物体直接选中父物体

脚本添加与父物体上

using UnityEditor;

[SelectionBase]
class Test
{
    
}

禁止调节颜色透明度

using UnityEditor;

class Test
{
    // 参数说明:第一个参数是否允许调节透明度
    // 第二个参数是否允许使用HDR
    [ColorUsage(false, false)]
    public Color color; 
}

要求必须使用某个属性

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
class Test
{
}

添加菜单功能

[AddComponentMenu("MyMenu/Do Something")]
using UnityEditor;

class Test
{
    [MenuItem("GameObject/MyMenu/Do Something")]
    static void DoSomething()
    {
        
    }
}

HelpURL

using UnityEngine;

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

OnOpenAssetAttribute

using UnityEditor;

class Test
{
    [OnOpenAsset]
    static bool OnOpenAsset(int instanceID, int line)
    {
        return false;
    }
}

设置脚本的执行顺序

using UnityEditor;

[DefaultExecutionOrder(100)]
class Test
{
    
}

HeaderAttribute

using UnityEngine;

class Test
{
    [Header("Header")]
    public int a;
    [Space(10)]
    [Range(0, 10)]
    [Tooltip("Tooltip")]
    [TextArea(3, 10)]
    [MultiLine(3)]
}

一个类或者结构体需要序列化才能在 inspector 中显示

using System;

[System.Serializable]
class Test
{
    
}

ContextMenu 可以在 inspector 中右键调用方法

using UnityEngine;

class Test
{
    [ContextMenu("Random_a","Random_a")]
    public int a;

    [ContextMenu("Do Something")]
    void DoSomething()
    {
        
    }

    void Random_a()
    {   
        a = Random.Range(0, 10);
    }
}

自定义组件

using UnityEngine;

[CustomEditor(typeof(Test))]
class TestEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
    }
}

inspector 中添加按钮

using UnityEngine;

[CustomEditor(typeof(Test))]
class TestEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        if (GUILayout.Button("Do Something"))
        {
            
        }
    }
}