【unity游戏开发——编辑器扩展】EditorApplication公共类处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询
注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。
文章目录
- 前言
- 一、监听编辑器事件
- 1、常用编辑器事件
- 2、示例
- 监听播放模式变化
- 延迟调用示例
- 自定义编辑器更新循环
- 二、获取Unity安装路径
- 1、API
- 2、示例
- 三、播放模式控制以及各种编辑器状态查询
- 1、API
- 1.1 编辑器播放模式控制
- 1.2 编辑器状态查询
- 2、示例
- 四、其他实用功能
- 1、场景管理
- 2、其他实用功能
- 专栏推荐
- 完结
前言
EditorApplication 是 Unity 编辑器中的一个静态类,提供了许多与编辑器本身相关的核心功能。这个类主要处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询。
官方文档:EditorApplication
一、监听编辑器事件
1、常用编辑器事件
- EditorApplication.update:每帧更新事件,编辑器更新循环,类似于 MonoBehaviour 的 Update
- EditorApplication.hierarchyChanged:层级视图变化事件,当场景中的对象发生变化时触发。
- EditorApplication.projectChanged:项目中有资源修改时触发(创建、删除、移动等)
- EditorApplication.playModeStateChanged:编辑器播放模式状态改变时触发。
- EditorApplication.pauseStateChanged:编辑器暂停状态变化时触发。
- EditorApplication.delayCall:延迟调用,在当前编辑器帧结束时执行
2、示例
监听播放模式变化
using UnityEditor; using UnityEngine; public class TestEditorApplicationEditorWindow : EditorWindow { [MenuItem("编辑器拓展/自定义窗口拓展/EditorApplication窗口拓展")] private static void OpenWindow() { TestEditorApplicationEditorWindow win = EditorWindow.GetWindow(); win.Show(); } private void OnEnable() { EditorApplication.playModeStateChanged += LogPlayModeState; } private void OnDestroy() { EditorApplication.playModeStateChanged -= LogPlayModeState; } private static void LogPlayModeState(PlayModeStateChange state) { switch (state) { case PlayModeStateChange.EnteredEditMode: Debug.Log("进入编辑模式"); break; case PlayModeStateChange.ExitingEditMode: Debug.Log("正在退出编辑模式"); break; case PlayModeStateChange.EnteredPlayMode: Debug.Log("进入播放模式"); break; case PlayModeStateChange.ExitingPlayMode: Debug.Log("正在退出播放模式"); break; } } }
延迟调用示例
EditorApplication.delayCall += () => { Debug.Log("这将在当前编辑器帧结束时执行"); // 可以安全地在这里修改编辑器状态 };
自定义编辑器更新循环
using UnityEditor; using UnityEngine; public class TestEditorApplicationEditorWindow : EditorWindow { [MenuItem("编辑器拓展/自定义窗口拓展/EditorApplication窗口拓展")] private static void OpenWindow() { TestEditorApplicationEditorWindow win = EditorWindow.GetWindow(); win.Show(); } private void OnEnable() { EditorApplication.update += MyUpdate; } private void OnDestroy() { EditorApplication.update -= MyUpdate; } void MyUpdate() { Debug.Log("更新"); } }
效果
二、获取Unity安装路径
1、API
- EditorApplication.applicationContentsPath:Unity安装目录Data路径。
- EditorApplication.applicationPath:Unity安装目录可执行程序路径。
2、示例
using UnityEditor; using UnityEngine; public class TestEditorApplicationEditorWindow : EditorWindow { [MenuItem("编辑器拓展/自定义窗口拓展/EditorApplication窗口拓展")] private static void OpenWindow() { TestEditorApplicationEditorWindow win = EditorWindow.GetWindow(); win.Show(); } void OnGUI() { if (GUILayout.Button("打印Unity安装路径")) { Debug.Log(EditorApplication.applicationContentsPath); Debug.Log(EditorApplication.applicationPath); } } }
效果
三、播放模式控制以及各种编辑器状态查询
1、API
1.1 编辑器播放模式控制
// 进入播放模式 EditorApplication.isPlaying = true; //或者EditorApplication.EnterPlaymode(); // 退出播放模式 EditorApplication.isPlaying = false; //或者EditorApplication.ExitPlaymode(); // 暂停播放模式 EditorApplication.isPaused = true; // 单帧步进(在暂停状态下执行一帧) EditorApplication.Step();
1.2 编辑器状态查询
// 检查编辑器是否正在播放 bool isPlaying = EditorApplication.isPlaying; // 检查播放模式是否暂停 bool isPaused = EditorApplication.isPaused; // 检查编辑器是否正在编译 bool isCompiling = EditorApplication.isCompiling; // 检查编辑器是否正在更新 bool isUpdating = EditorApplication.isUpdating;
2、示例
using UnityEditor; using UnityEngine; public class TestEditorApplicationEditorWindow : EditorWindow { [MenuItem("编辑器拓展/自定义窗口拓展/EditorApplication窗口拓展")] private static void OpenWindow() { TestEditorApplicationEditorWindow win = EditorWindow.GetWindow(); win.Show(); } void OnGUI() { if (GUILayout.Button("进入播放模式")) { // EditorApplication.EnterPlaymode(); EditorApplication.isPlaying = true; } if (GUILayout.Button("退出播放模式")) { // EditorApplication.ExitPlaymode(); EditorApplication.isPlaying = false; } if (GUILayout.Button("暂停播放模式")) { EditorApplication.isPaused = true; } if (GUILayout.Button("继续播放模式")) { EditorApplication.isPaused = false; } if (GUILayout.Button("判断是否正在播放")) { if (EditorApplication.isPlaying) { Debug.Log("处于播放状态"); } else { Debug.Log("处于编辑状态"); } } if (GUILayout.Button("判断是否暂停")) { if (EditorApplication.isPaused) { Debug.Log("处于暂停状态"); } else { Debug.Log("处于非暂停状态"); } } } }
效果
四、其他实用功能
1、场景管理
// 保存当前场景 EditorApplication.SaveScene(); // 标记场景为已修改(显示*号提示) EditorApplication.MarkSceneDirty(); // 打开场景 EditorApplication.OpenScene("Assets/Scenes/MyScene.unity");
2、其他实用功能
// 锁定/解锁编辑器(防止意外修改) EditorApplication.LockReloadAssemblies(); EditorApplication.UnlockReloadAssemblies(); // 执行菜单项命令 EditorApplication.ExecuteMenuItem("Edit/Play"); // 退出编辑器 EditorApplication.Exit(0);
专栏推荐
地址 【unity游戏开发入门到精通——C#篇】 【unity游戏开发入门到精通——unity通用篇】 【unity游戏开发入门到精通——unity3D篇】 【unity游戏开发入门到精通——unity2D篇】 【unity实战】 【制作100个Unity游戏】 【推荐100个unity插件】 【实现100个unity特效】 【unity框架/工具集开发】 【unity游戏开发——模型篇】 【unity游戏开发——InputSystem】 【unity游戏开发——Animator动画】 【unity游戏开发——UGUI】 【unity游戏开发——联网篇】 【unity游戏开发——优化篇】 【unity游戏开发——shader篇】 【unity游戏开发——编辑器扩展】 完结
好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。