注意
:考慮到編輯器擴展的內容比較多,我將編輯器擴展的內容分開,并全部整合放在【unity游戲開發——編輯器擴展】專欄里,感興趣的小伙伴可以前往逐一查看學習。
文章目錄
- 前言
- 一、監聽編輯器事件
- 1、常用編輯器事件
- 2、示例
- 監聽播放模式變化
- 延遲調用示例
- 自定義編輯器更新循環
- 二、獲取Unity安裝路徑
- 1、API
- 2、示例
- 三、播放模式控制以及各種編輯器狀態查詢
- 1、API
- 1.1 編輯器播放模式控制
- 1.2 編輯器狀態查詢
- 2、示例
- 四、其他實用功能
- 1、場景管理
- 2、其他實用功能
- 專欄推薦
- 完結
前言
EditorApplication 是 Unity 編輯器中的一個靜態類,提供了許多與編輯器本身相關的核心功能。這個類主要處理編輯器生命周期事件、播放模式控制以及各種編輯器狀態查詢。
官方文檔:EditorApplication
一、監聽編輯器事件
1、常用編輯器事件
EditorApplication.update
:每幀更新事件,編輯器更新循環,類似于 MonoBehaviour 的 UpdateEditorApplication.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,如果學習過程中遇到任何問題,也歡迎你評論私信找我。
贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注
,你的每一次支持
都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤
或者有更好的解決方法
,也歡迎評論私信告訴我哦!