Unity 编辑器扩展总结 一:编辑器开发入门

编辑器扩展总结

工欲善其事必先利其器

引言: 在项目开发中,编辑器扩展为开发者提供了开发自定义工具的功能,让开发者更加便利地使用编辑器开发项目。如若博客中存在错误,还请不吝赐教。所有参考的博客或者视频来源将在文末展示。
扩展: 在Unity2019.1版本后,官方推出全新的保留模式UI框架-UIElements,是一款可以轻松扩展unity编辑器的工具,未来版本可能会支持游戏运行模式。
开发版本: Unity 2018.1.3f1

相关博客传送门
一、编辑器开发入门

二、编辑器的相关特性

三、自定义Inspector面板

四、创建编辑器窗体

五、Gizmos辅助调试工具

六、扩展Scene视图

七、数组或list集合的显示方式

八、EditorPrefs、ScriptableObject、Undo

九、GUIStyle、GUISkin

十、AssetPostprocessor资源导入管线

编辑器开发入门

编辑器相关文件夹介绍

  1. Editor
  • 该文件夹可以放在项目的任何文件夹下,可以有多个"Editor"文件夹。
  • 编辑器扩展相关的脚本都要放在该文件夹内,该文件夹中的脚本只会对Unity编辑器起作用。
  • 项目打包的时候,不会被打包到项目中。如果编辑器相关脚本不放在该文件夹中,打包项目可能会出错。
  • 如果非要有些编辑器相关脚本不放在该文件夹中,需要在该类的前后加上UNITY_EDITOR的宏定义
  1. Editor Default Resources
  • 该文件夹需要放在Assets根目录下,用来存储编辑器所需要的图片等资源,书写的时候需要注意中间有空格隔开。此文件夹也不会被打包,访问方法为:EditorGUIUtility.Load()
  • 当然,也可以在Editor文件夹内创建一个Resources文件夹,将相关资源放在该文件夹内,通过Resources.Load()获取资源,也是可以的
  1. Gizmos
  • 该文件夹也需要放在Assets根目录下,可以用来存放Gizmos.DrawIcon()的图片资源

编辑器扩展的命名空间:
Using UnityEditor

[MenuItem]

添加菜单栏按钮

[MenuItem(“MyTools/test1”,false,priority)]

  • 第一个参数用来表示菜单的路径;
  • 第二个参数用来判断是否是有效函数,是否需要显示;
  • 第三个参数priority是优先级,用来表示菜单按钮的先后顺序,默认值为1000。一般菜单中的分栏,数值相差大于10。
  • 注意需要是静态方法

    例如:[MenuItem(“MyTools/test1”)]
    也可以添加在Unity默认的菜单栏中,例如添加到Window菜单中,[MenuItem(“Window/test2”)],添加到Assets下,[MenuItem(“Assets/Project中的按钮”)]

实现点击菜单按钮,删除场景或者Project中选中的多个对象

[MenuItem("MyTool/DeleteAllObj", true)]
private static bool DeleteValidate()   
{
    if (Selection.objects.Length > 0)
        return true;
    else
        return false;
}

[MenuItem("MyTool/DeleteAllObj",false)]
private static void MyToolDelete()
{
    //Selection.objects 返回场景或者Project中选择的多个对象
    foreach (Object item in Selection.objects)
    {
        //记录删除操作,允许撤销
        Undo.DestroyObjectImmediate(item);
    }
} 

DeleteValidate方法是MyToolDelete方法的有效函数,所以第二个参数为true。该有效函数用来判断当前是否选择了对象,如果选择了,返回true,才可以执行MyToolDelete方法。

添加快捷键

符号字符
%Ctr/Command
#Shift
&Alt
LEFT/Right/UP/DOWN方向键
F1-F2F功能键
_g字母g

例如:[MenuItem(“MyTools/test1 %_q”)] 快捷键 Ctrl+Q

CONTEXT

给某组件添加右键菜单选项

[MenuItem(“CONTEXT/组件名/按钮名”)]
注意CONTEXT大写

[MenuItem("CONTEXT/Rigidbody/Init")]
private static void RigidbodyInit() 
{
    //TODO
}

MenuCommand

用于获取当前操作的组件
如下,给自定义的组件PlayerHealth添加右键Init按钮

[MenuItem("CONTEXT/PlayerHealth/Init")]
static void Init(MenuCommand cmd)
{
    PlayerHealth health = cmd.contex as PlayerHealth;
}

ContextMenu、ContextMenuItem

给某组件添加右边小齿轮菜单选项

[ContextMenu("FunctionName")]
public void FunctionName()
{
    //ToDo
}

给某属性添加右键菜单选项

[ContextMenuItem("Handle", "HandleHealth")]
public float health;

private void HandleHealth()
{
    //ToDo
}

P.S. 这两个特性是在UnityEngine命名空间下的,而不像其他[MenuItem]、Selection是在UnityEditor下的。

Selection

用于获取选择的游戏物体

  • Selection.activeGameObject 返回第一个选择的场景中的对象
  • Selection.gameObjects 返回场景中选择的多个对象,包含预制体等
  • Selection.objects 返回选择的多个对象
//遍历选择的对象,并立刻销毁
foreach(object obj in Selection.objects)
{
    DestroyImmediate(obj);
}

P.S. Destroy方法会将删除的对象放在缓存中,缓存满了,才完全删除,而在编辑器未运行的时候,是没有这片缓存的,所以需要用DestroyImmediate(),立刻销毁。当然,可以直接使用Undo.DestroyObjectImmediate()来销毁对象并记录销毁操作

参考资料

编辑器特殊文件夹及内置资源读取

Unity编辑器小教程

MenuItem和ContextMenu的使用方法

  • 62
    点赞
  • 415
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
.需要 Net 4.x’ 等效运行时版本。 ‘.不再支持 Net 3.5(已弃用)。 [文档、论坛、下载] [在 Discord 上加入我们] 适用于 Unity 的完整视觉行为创作解决方案,可帮助你创建高级 AI 行为和逻辑,包括三个独立、功能齐全但可流畅切换的模块供你选择,轻松添加至游戏中: ✔反应行为树。 ✔ 层次状态机。 ✔多角色对话树。 NodeCanvas 是一个产品级框架,被多款优秀的游戏采用,包括 Pamela、Hurtworld、Hand of Fate 2、Kim、Shroud of the Avatar、Kingdom、The Long Dark、Ghost of a Tale​​​ ​等等。 [游戏展示] 功能亮点 ------------------------------------- ● 三个可完全切换的图形模块供你选择。 ● 具有所有预期专业功能的时尚而直观的可视化节点编辑器。 (全部撤销/重做、放大/缩小、迷你地图、多选、复制、复制/粘贴、JSON 导入/导出、群组、注释等) ● 图形、GameObject 和全局黑板变量,以创建可重复使用和以智能体为中心的参数行为。 ● 具有实例或静态属性和字段的数据绑定变量。 ● 使用 UNET 的网络同步变量 (Network Sync Variable)。 (由于现已弃用 UNET,所以会将其替换为新的网络解决方案) ● 预制件可覆盖的变量。 ● 自动转换不同的变量数据类型。 ● 支持所有变量类型开箱即用。 ● 跨所有数量的智能体的可重复使用行为图。 ● 所有三种图形模块之间的无缝子图形嵌套。 (行为子树、子状态机、子对话树) ● 完整的子图变量参数化和贴图。 ● 模块化动作和条件任务设计。 ● 条件反应行为树评估。 ● 有条件和基于栈的 FSM 过渡。 ● 丰富多彩和内容翔实的运行时可视化调试。 ● 节点/任务浏览器,用以搜索、收藏和阅读内置文档。 ● 首选类型配置器,以根据项目需求定制与类型相关的菜单。 ● 图形迷你地图,以轻松浏览图形。 ● 图形控制台,单击鼠标即可自动定位故障节点。 ● 图形浏览器,用以搜索和查找图中的节点、任务和参数。 ● 图形重构器,以批量重构缺失的节点、任务和反射引用。 ● 实时运行时编辑,以更快速地完成设计目标。 ● 经过优化的反射任务,以自动集成现有的代码 API。 ● 内置事件系统,以在图形中沟通和传输数据。 ● 清晰且记录完善的 API,以扩展 NodeCanvas 框架并创建自己的动作、条件、节点,甚至全新的图形模块。 ● 对象和属性绘制器,以一切可能的方式自定义检查器。 ● 与大量第三方资源集成。 ● 与 FlowCanvas flowScripts 无缝集成。 ● 用户友好。轻量级。无需设置。 ● 性能稳定。初始化后零分配。异步图加载。 ● 支持所有平台开箱即用。 ● 包含全部 C# 源代码! ● 以及更多… ------------------------------------- 没有代码脚本?没问题。NodeCanvas 提供数百种精心制作的面向游戏的预制动作和条件,直接带你入门。此外,你可以采用专门的反射任务,以利用并控制所有现有代码和组件,无需编写任何代码! 当前的第三方资源扩展包括: • Chronos • 电影音序器 - SLATE • 电影导演 (Cinema Director) • Core GameKit • DOTween • Easy Save • Inventory Pro • LipSync • Love/Hate • Master Audio • 运动控制器 • PlayMaker • PolyNav • SALSA - Simple Waypoint System • 以及更多,根据你的需求… 社区驱动的扩展: • A* Project • cInput • FinalIK • ProCamera2D • Rewired • uFrame 此外,NodeCanvas 与 FlowCanvas 无缝集成,从而能够让你在行为树、FSM 和/或 对话树中嵌套 flowScripts,反过来也可以! “那么,里面包含什么?” ✔ Core NodeCanvas 框架。 ✔ 行为树模块。 ✔ 状态机模块。 ✔ 对话树模块。 ✔ 大量以游戏为导向的任务。 ✔ 大量第三方集成任务。 ✔ 完整的 C# 源代码。 ✔ 可靠的支持。 将 NodeCanvas 添加至你的项目中,享受 Unity 功能丰富、完整的视觉行为创作功能,实现各种可能性同时性能毫不逊色

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值