You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测Unity游戏刚启动或SceneManager刚加载Scene 0?

区分Unity启动加载Scene 0与SceneManager重新加载Scene 0的方法

下面是几种可行的检测方案,按需选择:

1. 静态持久化标记(推荐)

创建一个全局单例类,通过静态变量记录首次启动状态,利用DontDestroyOnLoad保证对象不随场景卸载销毁:

public class SessionState : MonoBehaviour
{
    public static bool isFirstLaunch = true;

    private void Awake()
    {
        DontDestroyOnLoad(gameObject);
    }
}

在Scene 0的入口脚本中判断:

void Start()
{
    if (SessionState.isFirstLaunch)
    {
        // 游戏刚启动完成,首次加载Scene 0
        Debug.Log("首次启动加载Scene 0");
        SessionState.isFirstLaunch = false;
    }
    else
    {
        // 通过SceneManager重新加载了Scene 0
        Debug.Log("重新加载Scene 0");
    }
}

原理:首次启动时静态变量isFirstLaunch为true,进入Scene 0后将其设为false;后续无论多少次重新加载Scene 0,该变量都会保持false,以此区分两种场景。

2. 场景加载计数器

通过统计Scene 0的加载次数来判断,同样依赖DontDestroyOnLoad的全局对象:

public class SceneLoadTracker : MonoBehaviour
{
    public static int scene0LoadCount = 0;

    private void Awake()
    {
        DontDestroyOnLoad(gameObject);
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        if (scene.buildIndex == 0)
        {
            scene0LoadCount++;
        }
    }
}

在Scene 0的脚本中判断:

void Start()
{
    if (SceneLoadTracker.scene0LoadCount == 1)
    {
        Debug.Log("首次启动加载Scene 0");
    }
    else
    {
        Debug.Log("重新加载Scene 0");
    }
}

原理:首次启动时Scene 0加载完成后计数器变为1,后续每次加载都会递增,通过计数器值即可区分首次启动与重新加载。

3. 时间差判断

利用应用启动时间与Scene 0加载时间的差值来区分:

public class LaunchChecker : MonoBehaviour
{
    private float scene0LoadTime;

    private void Awake()
    {
        DontDestroyOnLoad(gameObject);
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        if (scene.buildIndex == 0)
        {
            scene0LoadTime = Time.realtimeSinceStartup;
        }
    }

    public bool IsFirstLaunch()
    {
        // 阈值可根据项目启动速度调整,一般首次启动场景加载会紧跟应用启动
        return scene0LoadTime - Application.startTime < 1f;
    }
}

在Scene 0的脚本中调用:

void Start()
{
    var checker = FindObjectOfType<LaunchChecker>();
    if (checker.IsFirstLaunch())
    {
        Debug.Log("首次启动加载Scene 0");
    }
    else
    {
        Debug.Log("重新加载Scene 0");
    }
}

原理:首次启动时Scene 0的加载时间与应用启动时间差值极小;手动重新加载时,差值会远大于阈值(除非启动后立即手动加载,这种情况不适用)。

注意事项

  • 所有全局跟踪类必须放在Build Settings中设置的第一个场景(Scene 0)里,确保启动时被初始化。
  • 如果使用LoadSceneMode.Additive加载Scene 0,需要在判断逻辑中额外过滤加载模式,避免误判。

内容的提问来源于stack exchange,提问作者Pratyush Mahadevaiah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:00:59