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

——[HideInInspector]

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

[HideInInspector]
public int value;

 

 


——[System.Serializable]
Unity编辑器扩展——标签属性Attribute_第1张图片
让其他类中的变量显示在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("标题内容")]
Unity编辑器扩展——标签属性Attribute_第2张图片
给变量添加标题

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

 

 


——[Space(间距数值)]
Unity编辑器扩展——标签属性Attribute_第3张图片
给变量间添加间距

[Space(50)]
public int value;

 

 


——[Tooltip("悬停内容")]
Unity编辑器扩展——标签属性Attribute_第4张图片
给变量添加悬停内容

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

 

 


——[Range(min,max)]

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

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

 

 


——[Multiline(行数)]
Unity编辑器扩展——标签属性Attribute_第5张图片
给string类型变量设置行数

[Multiline(5)]
public string str;

 

 


——[TextArea]
Unity编辑器扩展——标签属性Attribute_第6张图片
把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"=排序序号)]
Unity编辑器扩展——标签属性Attribute_第7张图片
Unity编辑器扩展——标签属性Attribute_第8张图片
在Project面板下创建一个配置文件,方便进行数据的管理(只能给类添加这个属性)

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();
AssetDatabase.CreateAsset(data, "Assets/Resources/玩家配置.asset");

 

 

 

 

——[MenuItem("层级/结构 [快捷键]",priority = 优先级)]
Unity编辑器扩展——标签属性Attribute_第9张图片
为工具栏提供自定义按钮(使用MenuItem属性还可以为Inspector面板组件的小齿轮下增加按钮:[MenuItem("CONTEXT/脚本名/新增的按钮名")])

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;
        }
    }
}

 

 

 

——[AddComponentMenu(层级/结构)]
Unity编辑器扩展——标签属性Attribute_第10张图片
将此脚本添加到组件栏中(只能给类添加这个属性)

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

 

 


——[RequireComponent(typeof(添加的组件))]
Unity编辑器扩展——标签属性Attribute_第11张图片
添加此脚本时如果没有Require的组件则自动添加(只能给类添加这个属性)

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

 

 


——[ContextMenu(“自定义的操作名”)]或[MenuItem("CONTEXT/脚本名/新增的按钮名")]
Unity编辑器扩展——标签属性Attribute_第12张图片
为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(“操作名”, “执行的方法名”)]
Unity编辑器扩展——标签属性Attribute_第13张图片 
为字段添加一个右键菜单,执行一个此类中的方法(只能给字段添加这个属性)

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]
Unity编辑器扩展——标签属性Attribute_第14张图片
使一个物体只能添加一个此脚本(只能给类添加这个属性)

[DisallowMultipleComponent]
public class Test : MonoBehaviour
{
  
}

 

 


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

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

 

 


——[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("成功调用");
        }
    }
}

 

你可能感兴趣的:(Unity开发实战,Unity编辑器扩展)