前言
人区别于动物的重要技能就是创造和使用工具。
为什么Unity成为了大众的选择,我想其实很大一部分原因是因为Asset Store上面的插件!
正是这样一个庞大的工具式生态系统,给开发者减轻了很多做游戏的成本,并且插件本身也是一种交流与学习的平台,正是有了它们的存在,才使得开发者在成长的路上、在制作项目的过程中,如虎添翼。
正是这样一个庞大的工具式的生态系统,让我们告别无编辑器UI制作的低效工作的NGUI,让非程序员通过简单学习都能够动作的PlayMaker,带AI架构的 Behavior Designer,加密…… 等等,你能想到的功能系统,或许都能在商店里找到。
而最终成就插件的基石必不可缺的一部分:UnityEditor。
Hello World!
Unity对编辑器脚本有设定限制,脚本一放在Editor的文件夹目录之下;脚本引用通常会有
using UnityEditor;
Unity引擎中,我们常常在各种窗口进行着各种工作,如下图中
这种窗口我们也可以用代码出来,新建一个cs脚本并放在任意一个Editor文件夹下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using UnityEngine; using UnityEditor; public class Demo_EditorWindow : EditorWindow { void OnGUI() { EditorGUILayout.LabelField("Hello World!"); } [MenuItem("菜单/测试窗口")] static void OpenWindow() { EditorWindow.GetWindow<Demo_EditorWindow>(false, "窗口名", true).Show(); } } |
运行效果图:
第一步就算完成了,欢迎进入编辑器世界,下面解析一下几个函数
1 |
void OnGUI() |
窗口里面显示的内容
1 |
[MenuItem("菜单/测试窗口")] |
窗口的打开方式
1 |
EditorGUILayout |
这是一个UnityEditor 提供的元素集合的API,里面包括了常用的 字段、开关、变量输入、弹出框等等,也包括一些排布,总而言之这是一个必要用到的东东。下面会统一介绍到
另外想改变一个脚本在Inspector上面的视图的作法:比如Test.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using UnityEditor; [CustomEditor(typeof(Test))] public class Ins_Test : Editor Test test; void OnEnable() { test = target as Test; } public override void OnInspectorGUI() { base.OnInspectorGUI(); } } |
改变内容写在OnInspectorGUI 方法里就行。
我们在此方法里加入一些元素:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
//添加树向的背景方框 EditorGUILayout.BeginVertical("Box"); //这中间添加显示的内容 EditorGUILayout.LabelField("内容1"); //一个按扭 GUILayout.Button(EditorGUIUtility.ObjectContent(null, typeof(Rigidbody)), GUILayout.Height(40), GUILayout.Width(200)); EditorGUILayout.LabelField("内容2"); EditorGUILayout.EndVertical(); //书签页 toolBar = GUILayout.Toolbar(toolBar, new GUIContent[] { new GUIContent("麻美由真"), new GUIContent("苍井空"), new GUIContent("波多野结衣"), }); //横向排列 EditorGUILayout.BeginHorizontal(); switch (toolBar) { case 0: EditorGUILayout.LabelField(textM); break; case 1: //图片显示 GUILayout.Label((Texture2D)AssetDatabase.LoadAssetAtPath("Assets/demo001.jpg", typeof(Texture2D))); EditorGUILayout.TextArea(textCJK, GUILayout.Width(260), GUILayout.ExpandHeight(true)); break; case 2: EditorGUILayout.LabelField(textB); break; } EditorGUILayout.EndHorizontal(); //提示 EditorGUILayout.HelpBox("提示内容", MessageType.Info); //设置 key 与 value 之间,key的显示长度 EditorGUIUtility.labelWidth = 200; //缩进,数值越大,缩进越前 ,默认的缩进是0 EditorGUI.indentLevel = 1; //开关 isEditor = EditorGUILayout.Toggle("开关", isEditor); //禁用编辑 EditorGUI.BeginDisabledGroup(isEditor); intNum = EditorGUILayout.IntField("编辑值", intNum); EditorGUI.EndDisabledGroup(); //当编辑器改变时一定要调用此函数,此函数保存你所有的改变,此参数的作用域只有一个方法内。target 为改变的脚本 if (GUI.changed) EditorUtility.SetDirty(target); |
运行图:
PS:上面的明星是我随便在百度找的,在写这篇博客之前我一个都不认识。
延伸
为某游戏做的关卡编辑器部分截图
流程控制总窗口
主要代码的数量
事件管理器
建筑物编辑
路点
关卡评星编辑
除了Hierarchy,其余大部分都加入了编辑功能,当然也包括自己的快捷键,方便的菜单功能。
OK,先到这里吧。
太帅啦!好想学会~研究中。。。