Unity常用标签
Posted ht_game
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity常用标签相关的知识,希望对你有一定的参考价值。
标签的概念
标签在C#中也被叫做特性。特性(attribute)是一种允许我们向程序的程序集添加元数据的语言结构。它是用于保存程序结构信息的特殊类型的类。
特性的目的:告诉编译器把程序结构的某组元数据嵌入程序集。可以通过特性应用到结构来实现
特性的使用
1、通过在结构前放置特性片段来应用特性。
2、特性片段由方括号包围特性名和参数列表构成。
Unity的常用标签
标记字段
[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
例图:
Unity 为游戏对象设置标签
我们从【是什么】【为什么】【怎么用】三个问题,来讨论游戏对象的标签。
1. 什么是标签
标签 (Tag) 是可分配给游戏对象的参考词
。例如,可为玩家控制的角色定义“Player”标签,为场景中的各种树木定义为“Tree”标签。
具体到Unity中,比如,我们新建一个游戏对象,那么,Inspector面板,开头就是个Tag的坑位。
值是Untagged,也就是没有具体标签值。
2. 为什么要有标签
标签不是必须的,默认可以不设置。只有在你脚本需要用时,才需要设置一下。一个典型的例子是,脚本中,你拿到了一个gameObject,但不知道这个是啥东西,就可以用tag来判断。
3. 怎么用标签
3.1 为游戏对象设置标签
点击旁边的小三角,有几个默认的标签,但一般咱不用,咱自己定义。也就是自己Add Tag.
出来的窗口,点击加号,就可以自定义一个Tag:
添加好了,就可以把Tag那一栏,设置为你要的标签。
3.2 在脚本代码中使用
我们以碰撞检测来说明。
假设有个脚本,绑定到了某个gameObject A,然后设置为刚体,这样另一个也是刚体的游戏对象B,位置着渐靠近这个A,会发生碰撞,脚本中,会回调一个函数,叫OnTriggerEnter2D。
void OnTriggerEnter2D(Collider2D collider)
{
if (collider.gameObject.tag.Contains("Fruit")) {
//TODO
collider.gameObject.GetComponent<Fruit>().GetStatus();
}
}
代码如上,变量collider代表碰撞了谁,可以获得gameObject,但gameObject无法判断具体类型。
怎么办,就是通过读取tag,如果tag是Fruit,那说明碰到的物体,标签是Fruit。
假设碰到的物体B,它标签设置了“Fruit”,然后绑定了一个脚本叫“Fruit”,那想调用B的脚本函数,就可以用collider.gameObject.GetComponent<Fruit>()
,后面跟上脚本的各种函数了,例如GetStatus()。
以上是关于Unity常用标签的主要内容,如果未能解决你的问题,请参考以下文章