【unity游戏开发——编辑器扩展】EditorApplication公共类处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询

06-01 1565阅读

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【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游戏开发——编辑器扩展】EditorApplication公共类处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询

                  二、获取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);
                            }
                        }
                    }
                    

                    效果

                    【unity游戏开发——编辑器扩展】EditorApplication公共类处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询

                    三、播放模式控制以及各种编辑器状态查询

                    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("处于非暂停状态");
                                }
                            }
                        }
                    }
                    

                    效果

                    【unity游戏开发——编辑器扩展】EditorApplication公共类处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询

                    四、其他实用功能

                    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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

                    赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

                    【unity游戏开发——编辑器扩展】EditorApplication公共类处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码