使 MonoBehaviour 派生类除了在运行时之外,还在编辑模式和预制体编辑模式下执行。
默认情况下,MonoBehaviour 事件函数 仅在运行时执行。将 ExecuteAlways
应用于 MonoBehaviour 派生类会导致该类任何实例的事件函数也在编辑模式和预制体模式下执行。
此属性针对类,但它仅对继承自 MonoBehaviour 的类有效。
当您希望您的脚本在创作时执行操作或响应事件时,使用 [ExecuteAlways]
属性,这些操作或事件不一定与编辑器播放模式或独立播放器中的应用程序运行时发生的事情相关。有时,此类脚本的运行时功能与其编辑模式功能相同,而其他时候则差异很大。
重要的是要确保使用此属性的 MonoBehaviour 脚本没有运行时代码,这些代码可能会错误地执行并在编辑模式或预制体编辑模式下修改父游戏对象。为了避免这种情况,您可以将您的运行时代码放在一个条件块中,该块仅在 Application.IsPlaying 对脚本自己的父游戏对象为 true
时运行,如下面的代码示例所示。
如果您的脚本使用静态变量或单例模式,您应该确保属于播放世界的脚本实例和不属于播放世界的脚本实例不会通过这些变量或单例模式意外地相互影响。
在编辑模式下,事件函数不会像在运行时那样频繁地或在所有相同条件下被调用。在以下情况下调用事件函数
OnGUI
在接收到 EventType.ScrollWheel 的实例时被调用,该实例不会转发给 EventType.KeyDown 或 EventType.KeyUp。转发到 **游戏** 视图的事件会被添加到队列中,并不保证立即处理。另请参阅: Application.IsPlaying,runInEditMode,EditorApplication.QueuePlayerLoopUpdate。
using UnityEngine;
[ExecuteAlways] public class ExampleClass : MonoBehaviour { void Start() { if (Application.IsPlaying(gameObject)) { // Play logic } else { // Editor logic } } }