【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<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.pswp.cn/news/907380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot+Activiti7入坑指南初阶版

介绍  Activiti 是一个轻量级工作流程和业务流程管理 (BPM) 平台,面向业务人员、开发人员和系统管理员。其核心是一个超快且坚如磐石的 Java BPMN 2 流程引擎。它是开源的,并根据 Apache 许可证分发。Activiti 可以在任何 Java 应用程序、服务器、集群或云中运行。它与 Spri…

VoltAgent 是一个开源 TypeScript 框架,用于构建和编排 AI 代理

​一、软件介绍 文末提供程序和源码下载 VoltAgent 是一个开源 TypeScript 框架&#xff0c;用于构建和编排 AI 代理 二、什么是 VoltAgent&#xff1f; AI 代理框架提供了构建由自主代理提供支持的应用程序所需的基础结构和工具。这些代理通常由大型语言模型 &#xff08;&am…

《仿盒马》app开发技术分享-- 订单详情页(端云一体)

开发准备 在之前的章节中我们实现了订单的提交&#xff0c;以及提交之后跳转到确认订单页面&#xff0c;在确认订单页面我们添加了一个入口&#xff0c;这个入口是查询订单&#xff0c;当我们点击入口时&#xff0c;我们需要跳转到一个新的界面&#xff0c;这个界面通过接收上…

传统项目管理总拖延?Scrum敏捷全流程拆解

在互联网高速发展的时代&#xff0c;企业竞争的核心要素正逐渐向 "速度" 倾斜。市场环境瞬息万变&#xff0c;用户需求呈现出多元化、动态化的显著特征&#xff0c;而传统管理模式固有的滞后性与僵化性&#xff0c;已难以匹配快速迭代的市场需求。在此背景下&#xf…

GelSight Mini触觉传感器:7μm精度+3D 映射,赋能具身智能精密操作

GelSight Mini 高分辨率视触觉传感器采用先进的光学成像与触觉感知技术&#xff0c;赋予机器人接近人类的触觉能力。该设备可捕捉物体表面微观细节&#xff0c;并生成高精度的2D/3D数字映射&#xff0c;帮助机器人识别形状、纹理及接触力&#xff0c;从而执行更复杂、精准的操作…

【电路笔记 TMS320F28335DSP】McBSP 从源时钟得到 生成时钟 CLKG 帧同步信号 FSG

对应于原文 Multichannel Buffered Serial Port (McBSP)的 2.5.3 Data Clock Generation。 CLKG Figure 2-4. Sample Rate Generator Block Diagram CLKG 是采样率发生器输出的数据位时钟&#xff08;Data Bit Clock&#xff09;&#xff0c;它被用来控制&#xff1a; 数据发…

(25年5.28)ChatGPT Plus充值教程与实用指南:附国内外使用案例与模型排行

更多具体来源&#xff1a;查看原文 ChatGPT Plus 充值教程 由于国内卡无法直接充值 chatgpt&#xff0c;通常需要借助虚拟卡。目前咱们常用的方式是通过虚拟卡平台获取。因平台审核要求这里不细说&#xff0c;具体看原文。 ChatGPT Plus主要使用方向 ChatGPT Plus 提供了更…

38. 自动化测试异步开发之编写客户端异步webdriver接口类

Selenium异步浏览器操作实现原理深度解析 一、AsyncBrowser类核心结构 1.1 类定义与启动方法 class AsyncBrowser(Command):@classmethodasync def start(cls, remote_driver_server: str

国芯思辰| 霍尔电流传感器AH811为蓄电池负载检测系统安全护航

在电动车、储能电站、不间断电源&#xff08;UPS&#xff09;等设备中&#xff0c;蓄电池作为关键的储能单元&#xff0c;其运行状态直接关系到设备的稳定性和使用寿命。而准确监测蓄电池的负载情况&#xff0c;是保障其安全、高效运行的关键。霍尔电流传感器 AH811凭借独特的技…

[Java恶补day8] 3. 无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “…

kafka学习笔记(三、消费者Consumer使用教程——从指定位置消费)

1.简介 Kafka的poll()方法消费无法精准的掌握其消费的起始位置&#xff0c;auto.offset.reset参数也只能在比较粗粒度的指定消费方式。更细粒度的消费方式kafka提供了seek()方法可以指定位移消费允许消费者从特定位置&#xff08;如固定偏移量、时间戳或分区首尾&#xff09;开…

【JS进阶】JavaScript 中 this 值的确定规则

JavaScript 中 this 值的确定规则 1. 默认绑定&#xff08;独立函数调用&#xff09; 当函数作为普通函数调用时&#xff0c;this 指向全局对象&#xff08;浏览器中是 window&#xff0c;Node.js 中是 global&#xff09;&#xff0c;严格模式下是 undefined。 function sh…

【凌智视觉模块】rv1106 部署 pp-humseg 模型

人像分割简介 ❀ 凌智视觉模块 是一款基于rv1106芯片开发的视觉模块&#xff0c;专注于视觉模型部署与开发。 人像分割是一种基于计算机视觉的技术&#xff0c;通过深度学习算法精准识别图像或视频中的人物主体&#xff0c;将其与背景进行像素级分离。该技术可实时运行于移动端…

wangeditor富文本编辑器+vue3粘贴内容样式处理

又是一个风格和日立的上午&#xff0c;某只菜鸟高高兴兴的骑着小电驴去上班&#xff0c;本着上班只要不迟到的理念飞速前行&#xff08;迟到扣钱啊~&#xff09;&#xff0c;高高兴兴的行走在路上。来到工位刚拴上我的绳子组长就开始滴滴俺&#xff0c;顿时我心中大感不妙&…

实测,大模型谁更懂数据可视化?

大家好&#xff0c;我是 Ai 学习的老章 看论文时&#xff0c;经常看到漂亮的图表&#xff0c;很多不知道是用什么工具绘制的&#xff0c;或者很想复刻类似图表。 实测&#xff0c;大模型 LaTeX 公式识别&#xff0c;出乎预料 前文&#xff0c;我用 Kimi、Qwen-3-235B-A22B、…

深度学习-梯度消失和梯度爆炸

梯度消失 在某些神经网络中&#xff0c;随着网络深度的增加&#xff0c;梯度在隐藏层反向传播时倾向于变小&#xff0c;这就意味着&#xff0c;前面隐藏层中的神经元要比后面的学习起来更慢&#xff0c;这种现象就叫做“梯度消失”&#xff1b; 梯度爆炸 如果我们进行一些特殊…

Go 语言基础 2 Func,流程控制

更多个人笔记见&#xff1a; github个人笔记仓库 gitee 个人笔记仓库 个人学习&#xff0c;学习过程中还会不断补充&#xff5e; &#xff08;后续会更新在github上&#xff09; 文章目录 Func 函数函数栈概念 函数表示类型 Anonymous func 匿名函数closure 闭包基础示例http利…

【Linux 学习计划】-- 倒计时、进度条小程序

目录 \r 、\n、fflush 倒计时 进度条 进度条进阶版 结语 \r 、\n、fflush 首先我们先来认识这三个东西&#xff0c;这将会是我们接下来两个小程序的重点之一 首先是我们的老演员\n&#xff0c;也就是回车加换行 这里面其实包含了两个操作&#xff0c;一个叫做回车&…

从零实现wss通信示例(WebSocket SSL)

客户端和服务端代码框架跟上一篇一致,仅增加了ssl的证书部分用于加密通信,明文通信(ws协议)见上一篇【https://blog.csdn.net/suoxd123/article/details/148093934】 1. 证书创建 1. 安装openssl 【官网地址】:https://slproweb.com/products/Win32OpenSSL.html 1.2 …

mysql 索引失效有哪些

InnoDB存储引擎根据索引类型不同&#xff0c;分为聚簇索引和二级索引 聚簇索引&#xff1a;叶子节点存放的是实际数据 二级索引&#xff1a;存放的是主键值&#xff0c;不是实际数据 1.对索引使用左或者左右模糊匹配 select * from t_user where name like %林‘&#xff1b…