返回

Unity 中监听场景进入播放状态的事件的正确方法

前端

当我们在 Unity 中开发游戏时,经常需要知道场景何时进入播放状态。这在很多情况下都很有用,比如:

  • 在场景中生成对象
  • 播放音乐或音效
  • 开始计时器
  • 加载关卡

在 Unity 中,有两种方法可以监听场景进入播放状态的事件:

  1. 使用 EditorApplication.isPlaying 属性
  2. 使用 EditorApplication.playModeChanged 事件

使用 EditorApplication.isPlaying 属性

EditorApplication.isPlaying 属性是一个布尔值,表示场景是否处于播放状态。当场景进入播放状态时,该属性为 true;当场景退出播放状态时,该属性为 false。

using UnityEngine;

public class MyScript : MonoBehaviour
{
    void Update()
    {
        if (EditorApplication.isPlaying)
        {
            // 场景处于播放状态
        }
        else
        {
            // 场景没有处于播放状态
        }
    }
}

这种方法很简单,但存在一些问题。首先,EditorApplication.isPlaying 属性只在编辑器中有效。在构建的游戏中,该属性始终为 true。其次,当场景在编辑器中停止播放时,EditorApplication.isPlaying 属性不会立即变为 false。它会在下一帧变为 false。这可能会导致脚本在场景停止播放后仍然继续运行。

使用 EditorApplication.playModeChanged 事件

EditorApplication.playModeChanged 事件在场景进入或退出播放状态时触发。该事件有两个参数:

  • playMode:一个 PlayMode 枚举值,表示当前的播放模式。
  • enteredPlayMode:一个布尔值,表示场景是否刚进入播放状态。
using UnityEngine;

public class MyScript : MonoBehaviour
{
    void OnEnable()
    {
        EditorApplication.playModeChanged += OnPlayModeChanged;
    }

    void OnDisable()
    {
        EditorApplication.playModeChanged -= OnPlayModeChanged;
    }

    void OnPlayModeChanged(PlayMode playMode, bool enteredPlayMode)
    {
        if (enteredPlayMode)
        {
            // 场景刚进入播放状态
        }
        else
        {
            // 场景刚退出播放状态
        }
    }
}

这种方法比使用 EditorApplication.isPlaying 属性更可靠。它可以在编辑器和构建的游戏中使用,并且它会在场景进入或退出播放状态时立即触发。

结论

在 Unity 中,监听场景进入播放状态的事件时,推荐使用 EditorApplication.playModeChanged 事件。这种方法更可靠,可以在编辑器和构建的游戏中使用,并且它会在场景进入或退出播放状态时立即触发。