Unity编辑器扩展——标签属性Attribute

——[HideInInspector]

将公有的变量在Inspector面板上隐藏

[HideInInspector]
public int value;


——[System.Serializable]

让其他类中的变量显示在Inspector面板上

using UnityEngine;

public class Test : MonoBehaviour
{
    public A a;
}

[System.Serializable]
public class A
{
    public int value;
}


——[SerializeField]

序列化字段,可以将私有的变量在Inspector面板上显示,但此变量的访问级别还是私有的

[SerializeField]
private int value;


——[Header("标题内容")]

给变量添加标题

[Header("变量")]
public int value;


——[Space(间距数值)]

给变量间添加间距

[Space(50)]
public int value;


——[Tooltip("悬停内容")]

给变量添加悬停内容

[Tooltip("这是一个变量")]
public int value;


——[Range(min,max)]

给int、float、double这种数字类型变量添加范围

[Range(0,10)]
public int value;


——[Multiline(行数)]

给string类型变量设置行数

[Multiline(5)]
public string str;


——[TextArea]

把string类型变量在Inspector面板的显示变成一个TextArea

[TextArea]
public string str;


——[ColorUsage(是否可以设置透明度)]

调用颜色选项框

[ColorUsage(true)]
public Color c;


——[FormerlySerializedAs("原始的变量名")]

例如声明一个变量:public GameObject go1,然后给go1拖拽赋值,当将变量名go1改为go2时,引用会丢失。
可以添加一个FormerlySerializedAs的属性,使属性的参数与第一次声明变量时使用的名称一致,后期调整此变量名就不会出现引用丢失了

[FormerlySerializedAs("go1")]
public GameObject go1;

——[CreateAssetMenu("fileName="创建的文件名","menuName="层级/结构","order"=排序序号)]


在Project面板下创建一个配置文件,方便进行数据的管理(只能给类添加这个属性)
继承ScriptableObject的类必须创建单独的脚本

using UnityEngine;

[CreateAssetMenu(fileName = "PlayerData", menuName = "创建配置文件/Player/创建玩家信息")]
public class Test : ScriptableObject
{
    [Header("速度")]
    public int speed;
}

例如现在有一个预制体EmenyPrefab,它身上挂载了一个mono的脚本,脚本中有一些数据Speed,HP,MP,当每次创建这个预制体时都需要拷贝一份原预制体脚本中的数据,但其实这些数据都是一样的,这就造成了很大的资源浪费,这时就应该考虑使用一个继承ScriptableObject的脚本去存数据,在预制体上的组件中定义一个指向ScriptableObject对象的引用去得到数据,这样就使原来的大量值拷贝变为了拷贝一个引用并存储一个引用
还可以使用下面两句话创建配置文件

PlayerData data = ScriptableObject.CreateInstance<PlayerData>();
AssetDatabase.CreateAsset(data, "Assets/Resources/玩家配置.asset");

——[MenuItem("层级/结构 [快捷键]",priority = 优先级)]

为工具栏提供自定义按钮

using UnityEditor;
using UnityEngine;

public class Test : EditorWindow
{    
    //%:ctrl/command  #:shift  &:alt _:纯按键
    [MenuItem("Tool/MyTest %w", priority = 1)]
    private static void MyTest()
    {
        Debug.Log("MyTest");
    }

    //此方法用于判断MenuItem的validate参数,参数代表此方法是否为验证方法
    //验证方法会先于点击运行
    [MenuItem("Tool/MyTest", validate = true)]
    private static bool MyTestVerify()
    {
        GameObject[] gos = Selection.gameObjects;
        if (gos.Length > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}


——Menu.SetChecked(层级/结构,bool)

using UnityEngine;
using UnityEditor;

public class Test : MonoBehaviour
{
    [MenuItem("Tools/test")]
    static void TestEditor()
    {
        bool b = Menu.GetChecked("Tools/test");
        b = !b;
        Menu.SetChecked("Tools/test", b);
    }
}


 

——[AddComponentMenu(层级/结构)]

将此脚本添加到组件栏中(只能给类添加这个属性)

[AddComponentMenu("Test/MyTest")]
public class Test : MonoBehaviour
{
    
}


——[RequireComponent(typeof(添加的组件))]

添加此脚本时如果没有Require的组件则自动添加(只能给类添加这个属性)

[RequireComponent(typeof(CanvasGroup))]
public class Test : MonoBehaviour
{
    
}


——[ContextMenu(“自定义的操作名”)]或[MenuItem("CONTEXT/脚本名/新增的按钮名")]

为Inspector面板的小齿轮下增加按钮(只能给方法添加这个属性)

//使用[ContextMenu(“自定义的操作名”)]
[ContextMenu("My Test")]
public void MyMethon()
{
    Debug.Log("这是我的测试方法");
}

//使用[MenuItem("CONTEXT/脚本名/新增的按钮名")]
//[MenuItem("CONTEXT/Test/My Test")]
//private static void MyMethon()
//{
//    Debug.Log("这是我的测试方法");
//}


——MenuCommand
使用[MenuItem("CONTEXT/脚本名/新增的按钮名")]时,方法参数中传入MenuCommand后右键相应的组件后会自动获取到当前点击的物体,可以方便地获取到当前组件中的属性

[MenuItem("CONTEXT/Rigidbody/Clear Mass")]
private static void MyMethon(MenuCommand cmd)
{
    Rigidbody rigi = cmd.context as Rigidbody;
    rigi.mass = 100;
}

——[ContextMenuItem(“操作名”, “执行的方法名”)]
 
为字段添加一个右键菜单,执行一个此类中的方法(只能给字段添加这个属性)

public class Test : MonoBehaviour
{
    [ContextMenuItem("Mytest", "MyMethon")]
    public int value;

    public void MyMethon()
    {
        Debug.Log("这是我的测试方法");
    }
}

——[HelpURL("url")]

点击书本按钮打开所定义的url网址(只能给类添加这个属性)

[HelpURL("http://baidu.com")]
public class Test : MonoBehaviour
{
  
}


——[DisallowMultipleComponent]

使一个物体只能添加一个此脚本(只能给类添加这个属性)

[DisallowMultipleComponent]
public class Test : MonoBehaviour
{
  
}


——[ExecuteInEditMode]
让此脚本在Editor模式下也能执行Start、Update、OnGUI等方法(只能给类添加这个属性)

[ExecuteInEditMode]
public class Test : MonoBehaviour
{
    private void Awake()
    {
        print("ExecuteInEditMode");
    }
}


——DidReloadScripts
脚本编译完成后的回调

public class Test : MonoBehaviour
{
    [DidReloadScripts]
    static void ReloadScropts()
    {
          Debug.Log("DidReloadScripts");
    }
}


——[MonoPInvokeCallback(接收的代理类型)]
C#(托管代码)中注册方法可以从C++/C(非托管代码)调用

public class Test : MonoBehaviour
{
    internal delegate void TestCallBack(string eventName);

    [MonoPInvokeCallback(typeof(TestCallBack))]
    public static void OnCallBack(string eventName)
    {
        if (eventName == "complete")
        {
            Debug.Log("成功调用");
        }
    }
}


——[DllImport(“DLL名称”)]
C++/C(非托管代码) 的方法可以从C#调用

public class Test : MonoBehaviour
{
    internal delegate void TestCallBack(string eventName);

    [MonoPInvokeCallback(typeof(TestCallBack))]
    public static void OnCallBack(string eventName)
    {
        if (eventName == "complete")
        {
            Debug.Log("成功调用");
        }
    }
}


——OnSerializing、OnSerialized、OnDeserializing、OnDeserialized

public class People
{
    public int age;

    [OnSerializing]
    void OnSerializing(StreamingContext context)
    {
        Debug.Log("OnSerializing");
    }

    [OnSerialized]
    void OnSerialized(StreamingContext context)
    {
        Debug.Log("OnSerialized");
    }

    [OnDeserializing]
    void OnDeserializing(StreamingContext context)
    {
        Debug.Log("OnDeserializing");
    }

    [OnDeserialized]
    void OnDeserialized(StreamingContext context)
    {
        Debug.Log("OnDeserialized");
    }
}


只有通过二进制进行序列化和反序列化时才能调用到上面的特性

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Bug.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值