您的位置:首页 > 移动开发 > Unity3D

Unity下制作自定义插件

2014-03-22 17:05 423 查看
最近在恶搞一些插件的东西,真心恶心的东西啊。。有种发现我自己太没文化的节奏啊。下面我分享一下我遇到的问题。

首先要写这个插件,要把自己的脚本继承于EditorWindow,这是编辑器的东西记住要放在Editor文件夹下面哦。。什么原因可以看看这里Unity脚本编译,结合一下基础知识,大概就知道了,这里不罗嗦。直接主题。

在里面写一个弹出你窗口的逻辑:

[MenuItem("Window/myWindow")]
static void addWindow()
{
if(instance!=null)
{
instance.ShowUtility();
return;
}
instance = (MyEditor)EditorWindow.GetWindow(typeof(MyEditor), false, "MyWindow");
//		Rect rect = new Rect(0,0,800,500);
//		instance  = (MyEditor)EditorWindow.GetWindowWithRect(typeof (MyEditor),rect,true,"MyWindow");
instance.ShowUtility();
}
这里是可以停靠的窗口,就是向unity自己的东西可以把窗口合并到里面的(很难表达,不好意思我真心觉得我没什么文化)。注释掉的那个方法是独立的小窗口不能合并的哦,自己喜欢看你喜欢什么样的。。

接下来是重点之一,在里面绘制可编辑的东东,这东西其实就是重绘窗体。。你懂的。在OnGUI里面做吧,这件事。你可以使用GUILayout、EditorGUI、EditorGUILayout或者其他插件的GUI编辑工具都可以的,就是随心所欲了吧啊,呵呵。但是这些都有点区别的哦。像GUILayout.Box就没法带上Rect来定位了(我是没办法了),GUI.Box就可以。。这看你自己怎么用了。。下面贴一下例子:

GUI.Label(nameLabel, "Name:");
Name = EditorGUI.TextField(nameRect,Name);

GUI.Label(fpsLabelRect, "FPS:");
framerate = Mathf.Max((float)0, EditorGUI.FloatField(fpsRect, framerate));
GUI.Label(durationLabel, "Duration:");
float duration =  EditorGUI.FloatField(durationRect, framerate);
framerate = Mathf.Max((float)0,duration);
loopReverse = GUI.Toggle(loopReverseRect, loopReverse, "Loop Reverse");

staticTexture = (Texture2D)EditorGUI.ObjectField(staticTexRect,"Static Texture:",staticTexture,typeof(Texture2D),false);
这就是随便添加了几个东西在上面,完全可以编辑的。。但是。突然有个问题,我在里面设置了这些值有什么用。。我项目能获取并保存这些值么?嘿嘿。重点之二来了。就是把这些值使用[System.Serializable]保存起来,然后再项目自己的脚本拿出来使用的问题了。

首先定义一个class然后在头上放上[System.Serializable]这东西。。这不用我解释吧。。然后呢?这东西就是游戏项目和刚刚那个编译器交互的数据结构了,你要从刚刚的编辑器里面得到什么,这里怎么定义,你懂的。然后定义一个interface。。估计是用来在编辑器或者项目脚本都能使用到那个class吧。哇咔咔。。里面定义一些东东先,别急:

看看,类似这样:

GameObject gameObject
{
get;
}

上面那个“class name”[] States
{
get;
set;
}
然后再自己的脚本把这些方法干掉,记得哦。。然后呢在编辑器呢?这样吧:

interface type = (interface name)Selection.activeGameObject.GetComponent("interface name");
这个就是在Hierarchy下选中有这个interface的“儿子”的gameObject用的,看interface type是否为NULL了,大概就是这个过程了,还有就是最好在继承EditorWindow那个脚本中加上OnSelectionChange、OnFocus、OnHierarchyChange这些东东。方便你修改脚本的东东,或者编辑器里面修改了,都可以通知一下保存起来,编辑器改了要保存的话就把那个interface
type改了,然后调用

EditorUtility.SetDirty(SpriteGroup.gameObject);这个保存。反过来,脚本改了,通知编辑器要修改显示内容就告诉它重绘instance.Repaint();就可以了哦。

大概流程就是这样了,说得有点枯燥。不好意思啊,只怪本人没什么文化。。想贴图说明白点的,不知道为什么贴不了图。这只是我的做法哦。。如果有大神有更好的做法或者纠正我的,求指点。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: