初步认识拓展UnityEditor编辑器定制
热度 9529 2015-9-4 18:50 |个人分类:Unity3d| 编辑器, 拓展
我相信无数初学者看别人游戏都经常看到他们的Inspector中出现界面和默认不同,但又不知道怎么弄出来的.下面我粗略介绍一下如何自定义这些.
MenuItem属性把任意静态函数变成为一个菜单命令。仅静态函数能使用这个MenuItem属性。
用法:一般在Editor文件夹里创建代码,代码归类
[MenuItem("MyMenu/Do Something")]
void DoSomething()
{
Debug.Log("Perform operation");
}
运行即看到效果
[ContextMenu("XXX")]可以向你的上下文菜单中添加一个菜单项。 如下图
[ExecuteInEditMode]属性的作用是在EditMode下也可以执行脚本。unity中默认情况下,脚本只有在运行的时候才被执行,加上此属性后,不运行程序,也能执行脚本。可以不运行程序下观察程序效果。
AddComponentMenu 添加组件菜单
原本的脚本(组建)都会在“Component/Script”菜单下,在类之前声明一下这个,它便可以出现在"Componet"菜单下的任何位置
扩展Inspector面板
通过编译器命令[CustomEditor(typeof(XXX))]即可。
访问被编辑的对象
在Inspector视图中,我们经常需要访问正在被编辑的对象。Editor类的成员变量target正是提供了这一关联。
尽管如此,需要注意target是一个Object类型的对象,具体使用时可能需要类型转换(可以使用C#的泛型来避免重复的类型转换)。
实例:
1 2 3 4 5 6 7 8 |
usingUnityEngine; usingSystem.Collections; publicclassTest:MonoBehaviour { publicRect mRectValue; publicTexture texture; } |
usingUnityEditor;
usingUnityEngine;
//自定义Tset脚本
[CustomEditor(typeof(Test))]
//在编辑模式下执行脚本,这里用处不大可以删除。
[ExecuteInEditMode]
//请继承Editor
public class MyEditor:Editor
{
//在这里方法中就可以绘制面板。
public override void OnInspectorGUI()
{
//得到Test对象
Test test=(Test)target;
//绘制一个窗口
test.mRectValue=EditorGUILayout.RectField("窗口坐标",
test.mRectValue);
//绘制一个贴图槽
test.texture= EditorGUILayout.ObjectField("增加一个贴图",test.texture,typeof(Texture),true)asTexture;
}
}
按钮a是如何出现请看下面内容
扩展组件背景菜单
例如添加一个button按钮。
在MyEditor中的OnInspectorGUI中添加下面代码,在Test中添加函数a();
if (GUILayout.Button("a")) {
test.a();
}
Wizards
创造主观编辑器窗口
[MenuItem("GameObject/Create Other/Explosion")]
public static void CreateExplosion()
{
ScriptableWizard.DisplayWizard(“Create explosion”, "Create", "Apply");
}
效果图大概这样