Unity 多场景

    技术2022-07-14  71

    多场景不但可以归类go达到清晰的目的,游戏也可以用多场景来管理关卡,每个Level(关卡)一个scene,公用的东西放入一个公用scene里。

    例如这样划分: 公用:camera、canvas、storage、game、eventsystem Level:Light、场景相关的go *Light在关卡里

    问题1: Environmental lighting 不正确。 每个scene有自己的lingting settings。Unity会使用active scene的lighting settings

    问题2: Baking lighting不正确。 关掉Level scene里Lighting settings的Auto Generate(自动生成)。这样需手动来生成Baking lighting。 公用scene的可以打开。

    问题3: 在editor里已经在编辑,运行时重复加载level 在start里检查: void Start () { if (Application.isEditor) { for (int i = 0; i < SceneManager.sceneCount; i++) { Scene loadedScene = SceneManager.GetSceneAt(i); if (loadedScene.name.Contains("Level ")) { SceneManager.SetActiveScene(loadedScene); return; } } } StartCoroutine(LoadLevel()); }

    问题4 Unloading上一scene。 避免永远additive,记录下buildindex(在build中的index) IEnumerator LoadLevel (int levelBuildIndex) { … loadedLevelBuildIndex = levelBuildIndex; enabled = true; } IEnumerator LoadLevel (int levelBuildIndex) { enabled = false; if (loadedLevelBuildIndex > 0) { yield return SceneManager.UnloadSceneAsync(loadedLevelBuildIndex); } yield return SceneManager.LoadSceneAsync( levelBuildIndex, LoadSceneMode.Additive ); SceneManager.SetActiveScene( SceneManager.GetSceneByBuildIndex(levelBuildIndex) ); loadedLevelBuildIndex = levelBuildIndex; enabled = true; }

    关键代码: 建立场景 poolScene = SceneManager.CreateScene(name);

    加载场景 SceneManager.LoadScene(“Level 1”, LoadSceneMode.Additive);

    加载并且设置active,需要等待下一帧才可以设置,setactive只对于完成加载的scene void Awake () { shapes = new List(); StartCoroutine(LoadLevel()); } IEnumerator LoadLevel () { SceneManager.LoadScene(“Level 1”, LoadSceneMode.Additive); yield return null; SceneManager.SetActiveScene(SceneManager.GetSceneByName(“Level 1”)); }

    异步加载,有些场景未必加载后就直接工作,可以由scene自己抛出Hide Loading UI的时机。 IEnumerator LoadLevel () { enabled = false; yield return SceneManager.LoadSceneAsync( “Level 1”, LoadSceneMode.Additive ); SceneManager.SetActiveScene(SceneManager.GetSceneByName(“Level 1”)); enabled = true; }

    把建立的go放入scene instance = Instantiate(prefab); SceneManager.MoveGameObjectToScene(instance.gameObject, poolScene);

    Processed: 0.008, SQL: 9