本文分享Unity中[ExecuteInEditMode]
在默认情况下, 继承MonoBehaviour的脚本只能在PlayMode下才能执行相应的生命周期函数, 如Awake, Update等.
加上[ExecuteInEditMode]特性后, 任何添加了该组件的对象能够在EditMode下执行相应生命周期函数.
不同的是, 有一些在PlayMode下可能会被频繁调用的函数, 如Update, OnGUI等, 在EditMode下不会被一直调用, 而是在某些变化发生时才会被调用, 如:
- 对象的某些属性被改变时调用Update, 如在Editor中修改了对象的transform.
- GameView(Editor中的游戏面板)接收到了某些事件时调用OnGUI.
- SceneView(Editor中的场景面板)或GameView触发了重绘时调用OnRenderObject.
using UnityEngine;
[ExecuteInEditMode]
public class Test : MonoBehaviour
{
void Awake()
{
Debug.Log("Editor call Awake");
}
void Update()
{
Debug.Log("Editor call Update");
}
[UnityEditor.Callbacks.DidReloadScripts]
private static void OnReloadScript()
{
Debug.LogError("OnReloadScript");
}
}
一些注意的点
- 做了该标记的脚本会在运行模式开始的时候被销毁和重建. 即会在运行的时候调用OnDestroy, 然后Awake, 最后在停止运行时又调用OnDestroy和Awake.
- 脚本修改之后并不会触发生命周期的变化, 但是可以通过监听脚本重载的方式(标记特性: [UnityEditor.Callbacks.DidReloadScripts])来对脚本维护的数据进行更新.
- 可以通过对场景的生命周期监听来维护此类脚本.