public void SetScenePosition(SceneBorder.BorderPosition borderPos) { GameObject SceneObject = SceneManager.GetActiveScene().GetRootGameObjects()[0]; GameObject PrevSceneObject = PrevActive.GetRootGameObjects()[0]; SceneParam SceneParm = SceneObject.GetComponent <SceneParam>(); SceneParam PrevSceneParm = PrevSceneObject.GetComponent <SceneParam>(); switch (borderPos) { case SceneBorder.BorderPosition.top: SceneObject.transform.position = new Vector3(0, (-SceneParm.BottomBorder.transform.position.y + PrevSceneParm.TopBorder.transform.position.y), 0); break; case SceneBorder.BorderPosition.bottom: SceneObject.transform.position = new Vector3(0, -(SceneParm.TopBorder.transform.position.y - PrevSceneParm.BottomBorder.transform.position.y), 0); break; case SceneBorder.BorderPosition.right: SceneObject.transform.position = new Vector3((-SceneParm.LeftBorder.transform.position.x + PrevSceneParm.RightBorder.transform.position.x), 0, 0); break; case SceneBorder.BorderPosition.left: SceneObject.transform.position = new Vector3(-(SceneParm.RightBorder.transform.position.x - PrevSceneParm.LeftBorder.transform.position.x), 0, 0); break; } }
IEnumerator WaitToLoad(string Level, SceneBorder.BorderPosition borderPos = SceneBorder.BorderPosition.None) { while (!async.isDone) { yield return(new WaitForEndOfFrame()); } PrevActive = SceneManager.GetActiveScene(); SceneManager.SetActiveScene(SceneManager.GetSceneByName(Level)); if (borderPos != SceneBorder.BorderPosition.None) { SetScenePosition(borderPos); } }
/// <summary> /// For scene loads and unloads in game, we will have invisible boundaries with a generic script where I can set the index of the scenes between which /// the boundary belongs. /// </summary> /// <param name="sceneIndex"></param> public void LoadAdditiveScene(string sceneName, SceneBorder.BorderPosition borderPos = SceneBorder.BorderPosition.None) { async = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); LoadedAdditives.Add(sceneName); StartCoroutine(WaitToLoad(sceneName, borderPos)); }