——[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("变量")]
public int value;
[Space(50)]
public int value;
[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面板下创建一个配置文件,方便进行数据的管理(只能给类添加这个属性)
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 = 优先级)]
为工具栏提供自定义按钮(使用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(层级/结构)]
将此脚本添加到组件栏中(只能给类添加这个属性)
[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");
}
}
——[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("成功调用");
}
}
}