书接上回跟着书学Unity-《Unity3D游戏开发》宣雨松编著-(一)Unity的基础知识、编辑器结构、及拓展编辑器(拓展Project视图)
目录
3 拓展编辑器
3.2拓展Hierarchy视图
3.2.1拓展菜单
修改前菜单
using UnityEngine;
using UnityEditor;
public class Script_03_05
{
[MenuItem("GameObject/My Create/Cube",false,0)]//参数1:路径,参数2:是否验证函数,参数3:优先级
static void CreateCube()
{
GameObject.CreatePrimitive(PrimitiveType.Cube);//创建立方体
}
}
修改后菜单
整体使用和拓展Project视图一致还是比较简单的
3.2.2拓展布局
代码就不放了,使用原理和拓展Project视图的拓展布局基本一致,不过拓展Project视图时是监听EditorApplication.projectWindowItemOnGUI而拓展Hierarchy视图对应的监听是EditorApplication.hierarchyWindowItemOnGUI
EditorApplication - Unity 脚本 API
3.2.3重写菜单
重写前
重写后
using UnityEngine;
using UnityEditor;
public class Script_03_07
{
[MenuItem("Window/Test/test1")]
static void Test1()
{
}
[MenuItem("Window/Test/test2")]
static void Test2()
{
}
[MenuItem("Window/Test/test3")]
static void Test3()
{
}
[InitializeOnLoadMethod]
static void StartInitializeOnLoadMethod()
{
EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI;//添加委托
}
static void OnHierarchyGUI(int instanceID, Rect selectionRect)//创建对应委托 参数1:实例ID 参数2:选择主体
{
if(Event.current != null
&& selectionRect.Contains(Event.current.mousePosition)
&& Event.current.button == 1
&& Event.current.type <= EventType.MouseUp)//条件1:当前有事件发生 条件2:鼠标位置在目标选择主体内 条件3:按下鼠标右键 条件4:鼠标按下或释放
{
GameObject selectedGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject;//尝试将对象的引用 转为 实体对象
if(selectedGameObject) //条件:转换成功
{
Vector2 mousePosition = Event.current.mousePosition;//获取鼠标位置
EditorUtility.DisplayPopupMenu(new Rect(mousePosition.x, mousePosition.y, 0, 0), "Window/Test", null);//弹出菜单 参数1:位置 参数2:展示目录 参数3:我暂时还没弄清楚作用后后面再说
Event.current.Use();//使用该事件
}
}
}
}
代码的理解需要结合以下官方文档
将实例 ID 转换为对对象的引用:EditorUtility-InstanceIDToObject - Unity 脚本 API
将被立即处理的当前事件:Event-current - Unity 脚本 API
UnityGUI 输入和处理事件的类型:EventType - Unity 脚本 API
显示弹出菜单:EditorUtility-DisplayPopupMenu - Unity 脚本 API
3.3拓展Inspector视图(未完)