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

article/2025/8/25 21:08:57

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【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<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,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

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


http://www.hkcw.cn/article/CCkbegYrEK.shtml

相关文章

企业如何制定互联网营销策略?

互联网环境的变化速度&#xff0c;让很多企业不懂得在这个流量时代该如何更好地抓住推广时机。企业在制定互联网营销策略的过程中&#xff0c;该如何让策略能够成功生效&#xff0c;令其为企业发展赋能呢&#xff1f;下面就让我们分四步来简单了解下。 一、明确品牌定位 在制定…

Windows10下搭建sftp服务器(附:详细搭建过程、CMD连接测试、连接失败问题分析解决等)

最终连接sftp效果 搭建sftp服务器 1、这里附上作者已找好的 freeSSHd安装包 ,使用它进行搭建sftp服务器。 2、打开freeSSHd安装包,进行安装 (1)、选择完全安装 (2)、安装完成后,对提示窗口选择关闭 (3)、安装完成后,提示是否安装私有密钥。我们选择"是" (4)、安…

第五十九节:性能优化-GPU加速 (CUDA 模块)

在计算机视觉领域,实时性往往是关键瓶颈。当传统CPU处理高分辨率视频流或复杂算法时,力不从心。本文将深入探索OpenCV的CUDA模块,揭示如何通过GPU并行计算实现数量级的性能飞跃。 一、GPU加速:计算机视觉的必由之路 CPU的强项在于复杂逻辑和低延迟任务,但面对图像处理中高…

Linux---系统守护systemd(System Daemon)

一、systemd 概述 1. 定位与作用 init 系统替代品&#xff1a;作为 Linux 系统的第 1 个进程&#xff08;PID1&#xff09;&#xff0c;替代传统的 SysVinit 和 Upstart&#xff0c;负责管理系统服务、启动流程、资源分配等。统一管理&#xff1a;通过 单元&#xff08;Unit&…

Lua语言学习

为什么要用Lua 大部分的手机系统出于安全考虑禁止从网络上下载代码后动态的将这些下载的代码加载到内存中执行 所以&#xff0c;当你更新游戏时&#xff0c;就必须让用户从手机市场下载更新版本的程序&#xff0c;游戏程序通常体积较大&#xff0c;重新下载不仅耗时还耗流量&…

Maven 仓库类型与镜像策略

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

蓝牙和wifi相关的杂项内容总结

蓝牙的传输速率演进 蓝牙技术的传输速率随着版本的演进不断提升&#xff0c;不同版本和模式&#xff08;经典蓝牙 BR/EDR 和低功耗蓝牙 BLE&#xff09;的速率差异显著。以下是蓝牙传输速率的完整发展历程和技术细节&#xff1a; 经典蓝牙&#xff08;BR/EDR&#xff09;的速…

AAA稳态LED太阳光模拟器的特点剖析

AAA稳态LED太阳光模拟器作为光伏测试领域的重要设备&#xff0c;其技术特点直接关系到太阳能电池研发与质量控制的精度。以下从光谱匹配性、辐照均匀性、稳定性、能效比及智能化设计五个维度展开深度剖析&#xff1a; 一、光谱匹配性的突破性进展 传统氙灯光源在AM1.5G标准光谱…

cadence PCB 精度设置成小数点4位方法

1. allegro 在进行PCB设计时&#xff0c;单位一般默认为Mils&#xff0c;会遇到&#xff0c;精度只能选择2位&#xff0c;不能增加到4位&#xff0c; 精度的范围只能设置为0-2&#xff0c;不能设置为3或4 2. Setup -> User preference&#xff0c;进行设置&#xff0c…

VirtualBox安装 Rocky

这不是 CentOS要完蛋了吗&#xff0c;找了Rock Linux 。下载了一个差不多需要10G&#xff0c;艹。 然后在virtual BOX中安装&#xff0c;安装成功了 安装和Centos一样&#xff1a; 《VirtualBox安装以及安装CentOS7》 有几点需要注意就行了&#xff1a; 准备工作 确保主机的…

【MySQL】C语言连接

要使用C语言连接mysql&#xff0c;需要使用mysql官网提供的库&#xff0c;大家可以去官网下载 我们使用C接口库来进行连接 要正确使用&#xff0c;我们需要做一些准备工作: 保证mysql服务有效在官网上下载合适自己平台的mysql connect库&#xff0c;以备后用 下载开发库 s…

SpringBoot 日志

今天我们来学习日志&#xff0c;日志是啥玩意呢&#xff0c;其实我们之前使用过超简易版的日志&#xff0c;就是打印&#xff0c;我感觉大家应该都一样&#xff0c;使用打印来检查代码是不是执行到这里了&#xff0c;通过控制台打印的日志来发现问题&#xff0c;排查问题&#…

C语言——深入理解指针(1)

一、内存和地址 1.1 内存 在讲内存之前&#xff0c;我们先看一个生活中的案例&#xff1a; 假设有一栋宿舍楼&#xff0c;把你放在楼里&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的一个朋友来找你玩&#xff0c;如果想找到你&#xff0c;就得挨…

计算机操作系统(十四)互斥锁,信号量机制与整型信号量

计算机操作系统&#xff08;十四&#xff09;互斥锁&#xff0c;信号量机制与整型信号量 前言一、进程互斥与互斥锁1. 什么是进程互斥&#xff1f;2. 互斥锁是什么&#xff1f; 二、信号量机制&#xff08;解决互斥的更通用方案&#xff09;1. 为什么需要信号量&#xff1f;2. …

铸铁平台的优势和应用

铸铁平台是一种具有广泛应用的工业设备&#xff0c;其在各个领域均发挥着重要作用。本文将探讨铸铁平台的优势和应用&#xff0c;以帮助读者更好地了解这一重要设备。 一、铸铁平台的优势 强度高&#xff1a;铸铁平台采用高强度铸铁材料制成&#xff0c;具有优异的强度和耐磨性…

EfficMultiCoreMemoryPool项目

目录 1. 定长内存池介绍 2. tcmalloc整体框架了解 2.1 ThreadCache设计 各区间内存浪费分析 2.1.1 ThreadCache申请内存 2.1.2 ThreadCache释放内存 2.1.3 TLS线程局部变量 2.2 CentralCache设计 2.2.1 CentralCache申请内存 ThreadCache --> CentralCache的申请内…

【Doris基础】Apache Doris vs 传统数据仓库:架构与性能的全面对比

目录 1 引言 1.1 传统数据仓库的发展 1.2 现代分析型数据库的崛起 2 核心架构对比 2.1 传统数据仓库的架构 2.2 Doris的架构设计 3 关键技术差异 3.1 存储引擎对比 3.2 查询执行对比 3.3 数据摄入方式对比 4 性能与扩展性对比 4.1 性能基准对比 4.2 扩展性对比 5…

字符串转换函数-leetCode-008

问题描述&#xff1a; 实现一个将字符串转换为整数的函数时&#xff0c;需要考虑各种边界情况和细节&#xff0c;例如空格的处理、符号的判断、数字的读取以及整数溢出的处理等。以下是详细的解题过程以及代码实现。 问题分析 空格处理&#xff1a;需要丢弃字符串开头的空格字…

深度学习目标检测实战——YOLOv8从入门到部署

本文将手把手带你用 YOLOv8&#xff08;目前非常先进的目标检测框架&#xff09;实现从数据标注到模型部署的全流程实战&#xff0c;并达到工业级检测精度&#xff01; [yolo视频教程&#xff0c;戳蓝字即可学习] 这才是科研人该学的【YOLO算法全系列】&#xff0c;一口气学完…

C#对象集合去重的一种方式

前言 现在AI越来越强大了&#xff0c;有很多问题其实不需要在去各个网站上查了&#xff0c;直接问AI就好了&#xff0c;但是呢&#xff0c;AI给的代码可能能用&#xff0c;也可能需要调整&#xff0c;但是自己肯定是要会的&#xff0c;所以还是总结一下吧。 问题 如果有一个…