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常用标签的主要内容,如果未能解决你的问题,请参考以下文章

Unity游戏引擎都有哪些优势

unity学习啥最重要?

有没有人知道unity引擎下载的东西放在哪一个文件

生死狙击微端unity引擎显示游戏崩溃

小白_Unity引擎_Scene场景5个功能按钮和常用快捷方式

#yyds干货盘点# 100个 Unity小知识点 | Unity中常用的几种单例写法