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>();
}
}
總體效果