如何检测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
相关产品推荐
相关产品推荐

