注意
:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。
文章目录
- 前言
- 一、监听编辑器事件
- 1、常用编辑器事件
- 2、示例
- 监听播放模式变化
- 延迟调用示例
- 自定义编辑器更新循环
- 二、获取Unity安装路径
- 1、API
- 2、示例
- 三、播放模式控制以及各种编辑器状态查询
- 1、API
- 1.1 编辑器播放模式控制
- 1.2 编辑器状态查询
- 2、示例
- 四、其他实用功能
- 1、场景管理
- 2、其他实用功能
- 专栏推荐
- 完结
前言
EditorApplication 是 Unity 编辑器中的一个静态类,提供了许多与编辑器本身相关的核心功能。这个类主要处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询。
官方文档:EditorApplication
一、监听编辑器事件
1、常用编辑器事件
EditorApplication.update
:每帧更新事件,编辑器更新循环,类似于 MonoBehaviour 的 UpdateEditorApplication.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<TestEditorApplicationEditorWindow>();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<TestEditorApplicationEditorWindow>();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<TestEditorApplicationEditorWindow>();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<TestEditorApplicationEditorWindow>();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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!