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>();
}
}
总体效果