UnityEditor擴展 - 編輯器中的內置屬性Attribute

Unity內置屬性[Attribute]是一種類似修飾功能的標簽。可以對OnSceneGUI,InspectorGUI,MenuGUI,WindowGUI等實現各種各樣的GUI擴展。在這一章里將舉例介紹一些常用的內置屬性,并使用它們繼續進行界面的自由定制。

[Range(min, max)] //限定float, int 取值范圍。

public class NewBehaviourScript : MonoBehaviour  
{  
    [Range(1, 10)]  
    public int num1;  
  
    [Range(1, 10)]  
    public float num2;  
  
    [Range(1, 10)]  
    public long num3;  
  
    [Range(1, 10)]  
    public double num4;  
} 

[Multiline(lines)] //行數。
[TextArea(minLines, maxLines)] //文本域。

public class NewBehaviourScript : MonoBehaviour  
{  
    [Multiline(5)]  
    public string multiline;  
  
    [TextArea(3, 5)]  
    public string textArea;  
}

收攏Inspector時效果



展開Inspector時效果


[ContextMenuItem("string")] //右鍵點擊Inspector中的對應名字,快捷出現可選的函數執行。

public class NewBehaviourScript : MonoBehaviour  
{  
    [ContextMenuItem("Random", "RandomNumber")]  
    [ContextMenuItem("Reset", "ResetNumber")]  
    public int number;  
  
    void RandomNumber()  
    {  
        number = Random.Range(0, 100);  
    }  
  
    void ResetNumber()  
    {  
        number = 0;  
    }  
}

[ContextMenu("string")] //與上面類似,但是要點擊齒輪圖標或在腳本名上點右鍵。

public class NewBehaviourScript : MonoBehaviour  
{  
    [Range(0, 10)]  
    public int number;  
  
    [ContextMenu("RandomNumber")]  
    void RandomNumber()  
    {  
        number = Random.Range(0, 100);  
    }  
  
    [ContextMenu("ResetNumber")]  
    void ResetNumber()  
    {  
        number = 0;  
    }  
}

[ColorUsage(bool)] //調用顏色選項框。

public class NewBehaviourScript : MonoBehaviour  
{  
    public Color color1;  
  
    [ColorUsage(false)]  
    public Color color2;  
  
    [ColorUsage(true, true, 0, 8, 0.125f, 3)]  
    public Color color3;  
}

[Header("string")] //增加標題欄。

public class NewBehaviourScript : MonoBehaviour  
{  
    [Header("Player Settings")]  
    public Player player;  
  
    [Serializable]  
    public class Player  
    {  
        public string name;  
  
        [Range(1, 100)]  
        public int hp;  
    }  
  
    [Header("Game Settings")]  
    public Color background;  
}

[Space(height)] //行與行之間添加空白行。

public class NewBehaviourScript : MonoBehaviour  
{  
    public string str1;  
    [Space(20)]  
    public string str2;  
}

[Tooltip("string")] //顯示鼠標懸停所在函數的說明。

public class NewBehaviourScript : MonoBehaviour  
{  
    [Tooltip("說明內容")]  
    public long tooltip;  
}

[HideInInspector] //不顯示在inspector但是被序列化。即使是public修飾的變量,也不被顯示,不可以被外部類調用。

[System.NonSerialized] //不被序列化,也不顯示。

[SerializeField] //將private修飾的變量序列化。
[RequireComponent("componentName")] //自動掛載某組件。

[DisallowMultipleComponent] //添加在Class上方,當有別的腳本繼承該Class,別的腳本不能被掛載在object上。


[AddComponentMenu("path")] //在Menu上顯示該腳本。


[ExecuteInEditMode] //一些需要在run才能賦值的變量,直接在編輯器中被賦值。

[SelectionBase] //在Scene View中單擊選擇它的子物體時,會首先選中它自己。點2次子物體,才會選中要選的子物體。把該腳本的物體作為base的效果。
如圖父子結構,在Scene View中操作:

單擊Sphere → 選中Sphere

單擊Cube → 選中Cube

單擊Capsule → 選中 Cube

其他與Editor無關的屬性列舉
[RPC] [SyncVar] [Command] 網絡相關

[ImageEffectOpaque] ImageEffectTransformsToLDR

[DllImport("DLL Name")] 導入動態鏈接庫

最后上腳本,綜合了上述的實例運用。

using UnityEngine;  
  
[SelectionBase] //在Scene View中點選它的子物體時,會首先選中它。點2次才會選中要選的子物體。把該腳本的物體作為base的效果。  
[AddComponentMenu("Scripts/Player")] //把本腳本添加到菜單中  
[DisallowMultipleComponent] //繼承該Class的腳本不能被掛載  
[RequireComponent(typeof(Animator))] //自動添加組件  
[ExecuteInEditMode] //一些需要在run才能賦值的變量,直接在編輯器中被賦值。  
public class Player : MonoBehaviour  
{  
    [Header("Player")]   
    public string playerName;  
    [Multiline(2)][Tooltip("The titles")]  
    public string nikeName;  
    [TextArea(2, 2)]  
    public string address;  
  
    [Space(20)]  
    public Color color1; //RGBA  
  
    [ColorUsage(false)]  
    public Color color2; //RGB  
  
    [ColorUsage(true, true, 0, 8, 0.125f, 3)] //RGBA 增加亮度、曝光度  
    public Color color3;  
    [Space(20)]  
  
    [Range(0,100)]  
    public float health;  
    [Range(10, 20)]  
    public int damage;  
  
    [Header("Pet")]  
    public string pet1Name;  
  
    [ContextMenuItem("Random", "RandomNumber")]  
    [ContextMenuItem("Reset", "ResetNumber")]  
    public int pet1Level;  
  
    void RandomNumber()  
    {  
        pet1Level = Random.Range(1, 20);  
    }  
  
    void ResetNumber()  
    {  
        pet1Level = 1;  
    }  
  
    [Range(1, 100)]  
    public int pet1Damage;  
  
    [ContextMenu("RandomNumber")]  
    void RandomDamage()  
    {  
        pet1Damage = Random.Range(1, 100);  
    }  
  
    [ContextMenu("ResetNumber")]  
    void ResetDamage()  
    {  
        pet1Damage = 1;  
    }  
  
    [HideInInspector]  
    public int id;  
    [System.NonSerialized]  
    public int age;  
  
    [SerializeField]  
    Animator animator;  
  
    void Awake()  
    {  
        animator = GetComponent<Animator>();  
    }  
}  

總體效果


文章轉自:http://blog.csdn.net/mseol/article/details/54376134

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容