版本: Unity 6 (6000.0)
语言英语
  • C#

ExecuteAlways

UnityEngine 中的类

/

实现于: UnityEngine.CoreModule

建议更改

成功!

感谢您帮助我们改进 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们会阅读用户提出的每个建议变更,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们改进 Unity 文档的质量。

关闭

取消

描述

使 MonoBehaviour 派生类除了在运行时之外,还在编辑模式和预制体编辑模式下执行。

默认情况下,MonoBehaviour 事件函数 仅在运行时执行。将 ExecuteAlways 应用于 MonoBehaviour 派生类会导致该类任何实例的事件函数也在编辑模式和预制体模式下执行。

此属性针对类,但它仅对继承自 MonoBehaviour 的类有效。

当您希望您的脚本在创作时执行操作或响应事件时,使用 [ExecuteAlways] 属性,这些操作或事件不一定与编辑器播放模式或独立播放器中的应用程序运行时发生的事情相关。有时,此类脚本的运行时功能与其编辑模式功能相同,而其他时候则差异很大。

重要的是要确保使用此属性的 MonoBehaviour 脚本没有运行时代码,这些代码可能会错误地执行并在编辑模式或预制体编辑模式下修改父游戏对象。为了避免这种情况,您可以将您的运行时代码放在一个条件块中,该块仅在 Application.IsPlaying 对脚本自己的父游戏对象为 true 时运行,如下面的代码示例所示。

如果您的脚本使用静态变量或单例模式,您应该确保属于播放世界的脚本实例和不属于播放世界的脚本实例不会通过这些变量或单例模式意外地相互影响。

在编辑模式下,事件函数不会像在运行时那样频繁地或在所有相同条件下被调用。在以下情况下调用事件函数

  • Awake 仅在创建脚本组件的新实例时调用。这发生在 Unity 加载包含该组件的场景时,或者您在编辑器中创建新组件时,例如通过 **组件** 菜单。
  • Update 在每次重新绘制 **场景** 视图或 **游戏** 视图时被调用。这发生在场景中的某些内容发生变化时,例如游戏对象的位置,或者您使用鼠标或键导航场景时。
  • OnGUI 在 **游戏** 视图接收到非仅编辑器的 Event 时被调用,该事件未被使用,也不会转发给编辑器的键盘快捷键系统。例如,OnGUI 在接收到 EventType.ScrollWheel 的实例时被调用,该实例不会转发给 EventType.KeyDownEventType.KeyUp。转发到 **游戏** 视图的事件会被添加到队列中,并不保证立即处理。
  • OnRenderObject 和其他渲染回调函数在每次重新绘制 **场景** 视图或 **游戏** 视图时被调用。

另请参阅: Application.IsPlayingrunInEditModeEditorApplication.QueuePlayerLoopUpdate

using UnityEngine;

[ExecuteAlways] public class ExampleClass : MonoBehaviour { void Start() { if (Application.IsPlaying(gameObject)) { // Play logic } else { // Editor logic } } }