Unity 多场景

多场景不但可以归类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);

你可能感兴趣的:(unity)