Unity下制作自定义插件
2014-03-22 17:05
423 查看
最近在恶搞一些插件的东西,真心恶心的东西啊。。有种发现我自己太没文化的节奏啊。下面我分享一下我遇到的问题。
首先要写这个插件,要把自己的脚本继承于EditorWindow,这是编辑器的东西记住要放在Editor文件夹下面哦。。什么原因可以看看这里Unity脚本编译,结合一下基础知识,大概就知道了,这里不罗嗦。直接主题。
在里面写一个弹出你窗口的逻辑:
接下来是重点之一,在里面绘制可编辑的东东,这东西其实就是重绘窗体。。你懂的。在OnGUI里面做吧,这件事。你可以使用GUILayout、EditorGUI、EditorGUILayout或者其他插件的GUI编辑工具都可以的,就是随心所欲了吧啊,呵呵。但是这些都有点区别的哦。像GUILayout.Box就没法带上Rect来定位了(我是没办法了),GUI.Box就可以。。这看你自己怎么用了。。下面贴一下例子:
首先定义一个class然后在头上放上[System.Serializable]这东西。。这不用我解释吧。。然后呢?这东西就是游戏项目和刚刚那个编译器交互的数据结构了,你要从刚刚的编辑器里面得到什么,这里怎么定义,你懂的。然后定义一个interface。。估计是用来在编辑器或者项目脚本都能使用到那个class吧。哇咔咔。。里面定义一些东东先,别急:
看看,类似这样:
type改了,然后调用
EditorUtility.SetDirty(SpriteGroup.gameObject);这个保存。反过来,脚本改了,通知编辑器要修改显示内容就告诉它重绘instance.Repaint();就可以了哦。
大概流程就是这样了,说得有点枯燥。不好意思啊,只怪本人没什么文化。。想贴图说明白点的,不知道为什么贴不了图。这只是我的做法哦。。如果有大神有更好的做法或者纠正我的,求指点。。
首先要写这个插件,要把自己的脚本继承于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();就可以了哦。
大概流程就是这样了,说得有点枯燥。不好意思啊,只怪本人没什么文化。。想贴图说明白点的,不知道为什么贴不了图。这只是我的做法哦。。如果有大神有更好的做法或者纠正我的,求指点。。
相关文章推荐
- ARToolKit制作自定义Marker,并导入Unity
- [Unity插件]Behavior Designer:制作敌人AI
- Unity3d 开发(二)Unity 制作可发布插件
- 使用jQuery制作自定义PickList插件
- Unity 自定义NodeEditor 开发插件基础
- Unity Android findViewById与webview插件制作
- [置顶] Unity中基于NGUI插件制作序列帧动画
- 制作Unity插件之-常用GUI绘制组建
- Unity的【CaronteFX】插件制作掉落碰撞后破碎的物理效果(2)
- unity编辑器和插件的制作(四.1)
- Unity表情制作插件 - Mega Fiers 使用介绍
- 制作Unity插件之-创建一个Window窗口
- 【Unity&2D】使用Unity制作2D像素游戏用到的使用插件
- unity中用BMfont制作自定义美术中文字体
- 制作Unity插件之-创建一个Window窗口
- 【Unity 3D 游戏引擎】使用 2DToolkit 插件 制作2D精灵动画
- Unity 小地图制作插件NJG MiniMap的简单使用
- 制作Unity插件之-顶部菜单栏及右键菜单栏拓展
- unity插件制作(转载)