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

news2025/6/3 18:03:43

注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【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.coloradmin.cn/o/2395054.html

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

相关文章

React---day3

React 2.5 jsx的本质 jsx 仅仅只是 React.createElement(component, props, …children) 函数的语法糖。所有的jsx最终都会被转换成React.createElement的函数调用。 createElement需要传递三个参数&#xff1a; 参数一&#xff1a;type 当前ReactElement的类型&#xff1b;…

PyCharm接入DeepSeek,实现高效AI编程

介绍本土AI工具DeepSeek如何结合PyCharm同样实现该功能。 一 DeepSeek API申请 首先进入DeepSeek官网&#xff1a;DeepSeek 官网 接着点击右上角的 “API 开放平台“ 然后点击API keys 创建好的API key&#xff0c;记得复制保存好 二 pycharm 接入deepseek 首先打开PyCh…

CTFSHOW-WEB-36D杯

给你shell 这道题对我这个新手还是有难度的&#xff0c;花了不少时间。首先f12看源码&#xff0c;看到?view_source&#xff0c;点进去看源码 <?php //Its no need to use scanner. Of course if you want, but u will find nothing. error_reporting(0); include "…

RabbitMQ vs MQTT:深入比较与最新发展

RabbitMQ vs MQTT&#xff1a;深入比较与最新发展 引言 在消息队列和物联网&#xff08;IoT&#xff09;通信领域&#xff0c;RabbitMQ 和 MQTT 是两种备受瞩目的技术&#xff0c;各自针对不同的需求和场景提供了强大的解决方案。随着 2025 年的到来&#xff0c;这两项技术都…

金砖国家人工智能高级别论坛在巴西召开,华院计算应邀出席并发表主题演讲

当地时间5月20日&#xff0c;由中华人民共和国工业和信息化部&#xff0c;巴西发展、工业、贸易与服务部&#xff0c;巴西公共服务管理和创新部以及巴西科技创新部联合举办的金砖国家人工智能高级别论坛&#xff0c;在巴西首都巴西利亚举行。 中华人民共和国工业和信息化部副部…

【KWDB 创作者计划】_再热垃圾发电汽轮机仿真与监控系统:KaiwuDB 批量插入10万条数据性能优化实践

再热垃圾发电汽轮机仿真与监控系统&#xff1a;KaiwuDB 批量插入10万条数据性能优化实践 我是一台N25-3.82/390型汽轮机&#xff0c;心脏在5500转/分的轰鸣中跳动。垃圾焚烧炉是我的胃&#xff0c;将人类遗弃的残渣转化为金色蒸汽&#xff0c;沿管道涌入我的胸腔。 清晨&#x…

Android第十一次面试多线程篇

​面试官​&#xff1a; “你在项目里用过Handler吗&#xff1f;能说说它是怎么工作的吗&#xff1f;” ​候选人​&#xff1a; “当然用过&#xff01;比如之前做下载功能时&#xff0c;需要在后台线程下载文件&#xff0c;然后在主线程更新进度条。这时候就得用Handler来切…

安全,稳定可靠的政企即时通讯数字化平台

在当今数字化时代&#xff0c;政企机构面临着复杂多变的业务需求和日益增长的沟通协作挑战。BeeWorks作为一款安全&#xff0c;稳定可靠的政企即时通讯数字化平台&#xff0c;凭借其安全可靠、功能强大的特性&#xff0c;为政企提供了高效、便捷的沟通协作解决方案&#xff0c;…

LiquiGen流体导入UE

导出ABC 导出贴图 ABC导入Houdini UE安装SideFX_Labs插件 C:\Users\Star\Documents\houdini20.5\SideFXLabs\unreal\5.5 参考: LiquiGenHoudiniUE血液流程_哔哩哔哩_bilibili

Ubuntu下编译mininim游戏全攻略

目录 一、安装mininim 软件所依赖的库&#xff08;重点是allegro游戏引擎库&#xff09;二、编译mininim 软件三、将mininim打包给另一个Ubuntu系统使用四、安卓手机运行mininim 一、安装mininim 软件所依赖的库&#xff08;重点是allegro游戏引擎库&#xff09; 1. 用apt-get…

uniapp uni-id Error: Invalid password secret

common文件夹下uni-config-center文件夹下新建uni-id,新建config.json文件 复制粘贴以下代码&#xff0c;不要自己改&#xff0c;格式容易错 {"passwordSecret": [{"type": "hmac-sha256","version": 1}], "passwordStrength&qu…

第十二节:第三部分:集合框架:List系列集合:特点、方法、遍历方式、ArrayList集合的底层原理

List系列集合特点 List集合的特有方法 List集合支持的遍历方式 ArrayList集合的底层原理 ArrayList集合适合的应用场景 代码&#xff1a;List系列集合遍历方式 package com.itheima.day19_Collection_List;import java.util.ArrayList; import java.util.Iterator; import jav…

【办公类-18-07】20250527屈光检查PDF文件拆分成多个pdf(两页一份,用幼儿班级姓名命名文件)

背景需求&#xff1a; 今天春游&#xff0c;上海海昌公园。路上保健老师收到前几天幼儿的屈光视力检查单PDF。 她说&#xff1a;所有孩子的通知都做在一个PDF里&#xff0c;我没法单独发给班主任。你有什么办法拆开来&#xff1f; 我说&#xff1a;“没问题&#xff0c;问deep…

AI Agent的“搜索大脑“进化史:从Google API到智能搜索生态的技术变革

AI Agent搜索革命的时代背景 2025年agent速度发展之快似乎正在验证"2025年是agent元年"的说法&#xff0c;而作为agent最主要的应用工具之一(另外一个是coding)&#xff0c;搜索工具也正在呈现快速的发展趋势。Google在2024年12月推出Gemini Deep Research&#xff0…

Arduino学习-跑马灯

1、效果 2、代码 /**** 2025-5-30 跑马灯的小程序 */ //时间间隔 int intervaltime200; //初始化函数 void setup() {// put your setup code here, to run once://设置第3-第7个引脚为输出模式for(int i3;i<8;i){pinMode(i,OUTPUT);} }//循环执行 void loop() {// put you…

2. 手写数字预测 gui版

2. 手写数字预测 gui版 背景1.界面绘制2.处理图片3. 加载模型4. 预测5.结果6.一点小问题 背景 做了手写数字预测的模型&#xff0c;但是老是跑模型太无聊了&#xff0c;就配合pyqt做了一个可视化界面出来玩一下 源代码可以去这里https://github.com/Leezed525/pytorch_toy拿 …

特别篇-产品经理(三)

一、市场与竞品分析—竞品分析 1. 课后总结 案例框架&#xff1a;通过"小新吃蛋糕"案例展示行业分析方法&#xff0c;包含四个关键步骤&#xff1a; 明确目标行业调研确定竞品分析竞争策略输出结论 1&#xff09;行业背景分析方法 PEST分析法&#xff1a;从四个…

【unity游戏开发——编辑器扩展】AssetDatabase公共类在编辑器环境中管理和操作项目中的资源

注意&#xff1a;考虑到编辑器扩展的内容比较多&#xff0c;我将编辑器扩展的内容分开&#xff0c;并全部整合放在【unity游戏开发——编辑器扩展】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言一、AssetDatabase常用API1、创建资源1.1 API1.2 示例 …

BLE协议全景图:从0开始理解低功耗蓝牙

BLE(Bluetooth Low Energy)作为一种针对低功耗场景优化的通信协议,已经广泛应用于智能穿戴、工业追踪、智能家居、医疗设备等领域。 本文是《BLE 协议实战详解》系列的第一篇,将从 BLE 的发展历史、协议栈结构、核心机制和应用领域出发,为后续工程实战打下全面认知基础。 …

【机器学习基础】机器学习入门核心算法:GBDT(Gradient Boosting Decision Tree)

机器学习入门核心算法&#xff1a;GBDT&#xff08;Gradient Boosting Decision Tree&#xff09; 1. 算法逻辑2. 算法原理与数学推导2.1 目标函数2.2 负梯度计算2.3 决策树拟合2.4 叶子权重计算2.5 模型更新 3. 模型评估评估指标防止过拟合 4. 应用案例4.1 金融风控4.2 推荐系…