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

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发------编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。

文章目录

前言

EditorApplication 是 Unity 编辑器中的一个静态类,提供了许多与编辑器本身相关的核心功能。这个类主要处理编辑器生命周期事件、播放模式控制以及各种编辑器状态查询。

官方文档:EditorApplication

一、监听编辑器事件

1、常用编辑器事件

  • EditorApplication.update:每帧更新事件,编辑器更新循环,类似于 MonoBehaviour 的 Update
  • EditorApplication.hierarchyChanged:层级视图变化事件,当场景中的对象发生变化时触发。
  • EditorApplication.projectChanged:项目中有资源修改时触发(创建、删除、移动等)
  • EditorApplication.playModeStateChanged:编辑器播放模式状态改变时触发。
  • EditorApplication.pauseStateChanged:编辑器暂停状态变化时触发。
  • EditorApplication.delayCall:延迟调用,在当前编辑器帧结束时执行

2、示例

监听播放模式变化

csharp 复制代码
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;
        }
    }
}

延迟调用示例

csharp 复制代码
EditorApplication.delayCall += () => 
{
    Debug.Log("这将在当前编辑器帧结束时执行");
    // 可以安全地在这里修改编辑器状态
};

自定义编辑器更新循环

csharp 复制代码
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、示例

csharp 复制代码
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 编辑器播放模式控制

csharp 复制代码
// 进入播放模式
EditorApplication.isPlaying = true;
//或者EditorApplication.EnterPlaymode();

// 退出播放模式
EditorApplication.isPlaying = false;
//或者EditorApplication.ExitPlaymode();

// 暂停播放模式
EditorApplication.isPaused = true;

// 单帧步进(在暂停状态下执行一帧)
EditorApplication.Step();

1.2 编辑器状态查询

csharp 复制代码
// 检查编辑器是否正在播放
bool isPlaying = EditorApplication.isPlaying;

// 检查播放模式是否暂停
bool isPaused = EditorApplication.isPaused;

// 检查编辑器是否正在编译
bool isCompiling = EditorApplication.isCompiling;

// 检查编辑器是否正在更新
bool isUpdating = EditorApplication.isUpdating;

2、示例

csharp 复制代码
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、场景管理

csharp 复制代码
// 保存当前场景
EditorApplication.SaveScene();

// 标记场景为已修改(显示*号提示)
EditorApplication.MarkSceneDirty();

// 打开场景
EditorApplication.OpenScene("Assets/Scenes/MyScene.unity");

2、其他实用功能

csharp 复制代码
// 锁定/解锁编辑器(防止意外修改)
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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

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

相关推荐
两点王爷2 小时前
Java spingboot项目 在docker运行,需要含GDAL的JDK
java·开发语言·docker
Hare_bai3 小时前
WPF响应式UI的基础:INotifyPropertyChanged
ui·c#·wpf·xaml
Hare_bai3 小时前
WPF的布局核心:网格布局(Grid)
ui·c#·wpf·交互·xaml
万能螺丝刀15 小时前
java helloWord java程序运行机制 用idea创建一个java项目 标识符 关键字 数据类型 字节
java·开发语言·intellij-idea
朱剑君5 小时前
编程之巅:语言的较量
开发语言
Humbunklung5 小时前
Rust 编程实现猜数字游戏
开发语言·后端·rust
vvilkim5 小时前
深入理解C#数据类型:从基础到高级应用
开发语言·c#
朝阳396 小时前
Electron-vite【实战】MD 编辑器 -- 文件列表(含右键快捷菜单,重命名文件,删除本地文件,打开本地目录等)
electron·编辑器
真实的菜6 小时前
(22)大文件流式处理
java·开发语言
fpcc6 小时前
跟我学c++中级篇——动态库的资源处理
开发语言·c++