标签在C#中也被叫做特性。特性(attribute)是一种允许我们向程序的程序集添加元数据的语言结构。它是用于保存程序结构信息的特殊类型的类。
特性的目的:告诉编译器把程序结构的某组元数据嵌入程序集。可以通过特性应用到结构来实现
1、通过在结构前放置特性片段来应用特性。
2、特性片段由方括号包围特性名和参数列表构成。
[Space]
[Space]:可以与上面的字段形成一个间隙,并且可以带参数。例如 [Space(20)]
代码:
[Space(30)]
public int HP;
[Space(50)]
public string MP;
[Header(“XXX”)]
[Header(“XXX”)]:在Inspector面板上给定义的字段的上一行加段描述,可以将属性隔开,形成分组的感觉。
代码:
[Header("个人属性")]
public int HP;
public int MP;
[Header("天赋属性")]
public string Power;
[Tooltip(“XXX”)]
[Tooltip(“XXX”)]:在Inspector面板上鼠标移上定义的字段弹出描述 。
代码:
[Tooltip("个人属性")]
public int HP;
public int MP;
[Tooltip("天赋属性")]
public string Power;
[Range(min, max)]
[Range(min, max)]:限制数值变量的取值范围并以滑动条显示在Inspector面板上。
代码:
[Range(1,12)]
public int HP;
public int MP;
[SerializeField]
[SerializeField]:限在Inspector版面中显示非public属性,并且序列化 。
序列化:对象的寿命通常随着生成该对象的程序的终止而终止,有时候需要把在内存中的各种对象的状态(也就是实例变量,不是方法)保存下来,并且可以在需要时再将对象恢复。虽然你可以用你自己的各种各样的方法来保存对象的状态,但是Java给你提供一种应该比你自己的好的保存对象状态的机制,那就是序列化。
总结:Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里(系列化),并且可以从其它地方把该Byte 流里的数据读出来(反序列化)。
[Serializable]:告诉C#系统,下面类的数据可被写盘、读盘。用于类的上面
代码:
[SerializeField]
public int HP;
public int MP;
[SerializeField]
string Power;
[NonSerialized]
[NonSerialized]:使属性在Inspector中隐藏,但是还是可序列化,想赋值可以通过写程序赋值序列化
代码:
[NonSerialized]
public int HP;
public int MP;
[SerializeField]
string Power;
[HideInInspector] | 使属性在Inspector中隐藏,但是还是可序列化,想赋值可以通过写程序赋值序列化 |
---|---|
[System.Serializable] | 使自定义的类能进行序列化,即当做一个public成员的时候可以在Inspector显示 |
[FormerlySerializedAs(“XXX”)] | 该属性可以令变量以另外的名称进行序列化,并且在变量自身修改名称的时候,不会丢失之前的序列化的值 |
[ContextMenuItem(“显示的方法名”,”方法”)]
[ContextMenuItem(“显示的方法名”,”方法”)]:标记字段,给字段右键菜单段添加一个方法
代码:
[ContextMenuItem("add","fun")]
public int HP;
public int MP;
void fun()
{
HP += 1;
print(HP);
}
[MultilineAttribute]
[MultilineAttribute]:在string类型上使用,可以在Editor上输入多行文字
代码:
public int HP;
public int MP;
[MultilineAttribute]
public string Power;
[TextAreaAttribute]
[TextAreaAttribute]:该属性可以把string在Inspector上的编辑区变成一个TextArea
代码:
public int HP;
public int MP;
[TextAreaAttribute]
public string Power;
[RequireComponent(typeof(ClassName))]
[RequireComponent(typeof(ClassName))]:将被标记的类拖到(或者AddComponent)GameObject上时,自动再给你加上“ClassName”这个类 。
代码:
[RequireComponent(typeof(Rigidbody2D))]
public class MyAttribute : MonoBehaviour
{
public int HP;
public int MP;
public string Power;
}
作用:可以避免给一个物体重复添加组件,或者漏加组件
[ExecuteInEditMode]
[ExecuteInEditMode]:在编辑界面让你的功能(类)(非Play模式)起作用。任何添加了该组件的对象能够在EditMode下执行相应生命周期函数.。Unity中默认情况下,脚本只有在运行的时候才被执行,加上此属性后,不运行程序,也能执行脚本。
代码:
[ExecuteInEditMode]
public class MyAttribute : MonoBehaviour
{
public int HP;
public int MP;
public string Power;
string a = "123";
public void Speak()
{
Debug.Log(a);
print("asdf");//信息输出需要在方法中
}
public void Start()
{
Speak();
}
}
例图:
[AddComponentMenu(“XXX/XX/XXX”)]
[AddComponentMenu(“XXX/XX/XXX”)]:让Component菜单下出现你自定义的类,位置是“XXX/XX/XXX”
代码:
[AddComponentMenu("AR/MyAttribute")]
public class MyAttribute : MonoBehaviour
例图:
[CustomEditor(typeof(ClassName))]
[CustomEditor(typeof(ClassName))]:声明一个Class为自定义Editor的Class,可以制作一个自定义编辑器 。
代码:
[CustomEditor(typeof(Rigidbody2D))]
public class editortest : Editor
{
public override void OnInspectorGUI()
{
if (GUILayout.Button("拓展按钮"))
{
base.OnInspectorGUI();
}
}
}
注意:对编辑器拓展时,原有的功能还在。
[MenuItem(“一级菜单名/二级菜单名 _全局快捷键”]
[MenuItem(“一级菜单名/二级菜单名 _全局快捷键”]:在菜单中出现选项栏,执行对应功能。注:对应的函数必须是static
代码:
[MenuItem("我是菜单栏的/我是第一级/我是第二个 _b")]
public static void Speak()
{
print("asdf");
}
格式 | 注解 |
---|---|
[MenuItem(“一级菜单名/二级菜单名 _全局快捷键”] | 全局快捷键控制菜单选项 |
[MenuItem(“一级菜单名/二级菜单名”,false,1)] | 第二个参数是true则是是给该菜单项添加验证 ,第三个参数决定菜单的优先级 |
[ContextMenu(“菜单选项名”)]
[ContextMenu(“菜单选项名”)]:
[MenuItem(“CONTEXT/组件名/菜单名”)]
标记函数:在Inspector面板,右击包含这条标记的脚本,出现“菜单名”的菜单选项。
注:对应的函数必须是static
标记的函数可以添加 MenuCommand cmd 参数,cmd.context转换为当前组建类型后操作
点击组件中设置(鼠标右键),可以弹出Context菜单。
代码:
[MenuItem("CONTEXT/contexttext/NEW CONTEXT2")]
public static void speak()
{
print("adf");
}
[ContextMenu("Do Something")]
public void DoSomething()
{
Debug.Log("Do Something.");
}
[CreateAssetMenu(menuName = “MySubMenue/Create XXX “)]
[CreateAssetMenu(menuName = “MySubMenue/Create XXX “)]:
标记类,可以给project面板下的Create 菜单下新建一个自定义子菜单,用于新建自定义资源
用于ScriptableObject的子类,将这个类(相当于资源文件添加到Asset菜单项中)
[CreateAssetMenu(fileName = “Bullet”, menuName = “New Bullet”, order = 1)]
作用在 Assets 文件夹下,鼠标右键,菜单栏中添加一个按钮项,菜单名为 menuName,并执行生成名为 fileName 的脚本,order 为按钮显示顺序
代码:
[CreateAssetMenu(menuName = "MySubMenue/Create XXX")]
public class MyAttribute : ScriptableObject