using DG.Tweening; using System.Collections; using UnityEngine; using UnityEngine.SceneManagement; public class SceneLoader : MonoBehaviour { /// /// 场景切换控制 /// public static SceneLoader instance; /// /// 要加载的场景名称 /// public string sceneName; /// /// 异步操作 /// private AsyncOperation asyncOperation; /// /// 是否正在加载场景 /// public bool isOnLoad = false; /// /// 记录当前场景 /// public string sceneRecording = "DongYing_Main"; /// /// /// public string ShowModerName; public string CeShistr; public string CeShistr2; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); Application.ExternalCall("animationFinish"); } else { Destroy(gameObject); } } private void Update() { #if UNITY_EDITOR if (Input.GetKeyDown(KeyCode.B)) { MasterShot(); } if (Input.GetKeyDown(KeyCode.N)) { SwitchTheSceneOfPowerDistributionRoom(CeShistr); } if (Input.GetKeyDown(KeyCode.M)) { LargeScaleScene(CeShistr2); } #endif } //前端调用Unity /// /// 主场景 /// public void MasterShot() { if (sceneRecording == "DongYing_Main") { GameManager.CameraMove.ShieldingOperation = true; GameManager.CameraMove.ResetTarget(); Camera.main.transform.DOMove(GameManager.Instance.AllPos[0].position, 1f).OnComplete(() => { GameManager.Instance.isShowUI = true; GameManager.CameraMove.enabled = true; GameManager.CameraMove.Init(); }); Camera.main.transform.DORotate(GameManager.Instance.AllPos[0].eulerAngles, 1f); } else { LoadScene("1"); } } /// /// 单个模型切换 /// /// 配电房名称 public void SwitchTheSceneOfPowerDistributionRoom(string msg) { Debug.Log("配电房切换...:" + msg); if(sceneRecording== "DongYing_Main") { if (isOnLoad) return; isOnLoad = true; GameManager.Instance.ModerShow(msg); switch (msg) { case "空调": GameManager.CameraMove.ShieldingOperation = true; GameManager.CameraMove.ResetTarget(); Camera.main.transform.DOMove(GameManager.Instance.AllPos[2].position, 1f).OnComplete(() => { ShowModerName = msg; LoadScene("2"); }); Camera.main.transform.DORotate(GameManager.Instance.AllPos[2].eulerAngles, 1f); break; case "配电房1": GameManager.CameraMove.ShieldingOperation = true; GameManager.CameraMove.ResetTarget(); Camera.main.transform.DOMove(GameManager.Instance.AllPos[3].position, 1f).OnComplete(() => { ShowModerName = msg; LoadScene("2"); }); Camera.main.transform.DORotate(GameManager.Instance.AllPos[3].eulerAngles, 1f); break; case "配电房2": GameManager.CameraMove.ShieldingOperation = true; GameManager.CameraMove.ResetTarget(); Camera.main.transform.DOMove(GameManager.Instance.AllPos[4].position, 1f).OnComplete(() => { ShowModerName = msg; LoadScene("2"); }); Camera.main.transform.DORotate(GameManager.Instance.AllPos[4].eulerAngles, 1f); break; case "配电房3": GameManager.CameraMove.ShieldingOperation = true; GameManager.CameraMove.ResetTarget(); Camera.main.transform.DOMove(GameManager.Instance.AllPos[5].position, 1f).OnComplete(() => { ShowModerName = msg; LoadScene("2"); }); Camera.main.transform.DORotate(GameManager.Instance.AllPos[5].eulerAngles, 1f); break; case "照明": GameManager.CameraMove.ShieldingOperation = true; GameManager.CameraMove.ResetTarget(); Camera.main.transform.DOMove(GameManager.Instance.AllPos[1].position, 1f).OnComplete(() => { ShowModerName = msg; LoadScene("2"); }); Camera.main.transform.DORotate(GameManager.Instance.AllPos[1].eulerAngles, 1f); break; } } else { ModelDisplay.instance.ModerShow(msg); switch (msg) { case "空调": Movement(ModelDisplay.instance.O[0]); break; case "配电房1": Movement(ModelDisplay.instance.O[1]); break; case "配电房2": Movement(ModelDisplay.instance.O[2]); break; case "配电房3": Movement(ModelDisplay.instance.O[3]); break; case "照明": Movement(ModelDisplay.instance.O[4]); break; } } } /// /// 大场景切换 /// public void LargeScaleScene(string msg) { if (sceneRecording == "DongYing_Main") { GameManager.Instance.ModerShow(msg); switch (msg) { case "科技馆": Movement(GameManager.Instance.MainPos[0]); break; case "少年宫": Movement(GameManager.Instance.MainPos[1]); break; case "图书馆": Movement(GameManager.Instance.MainPos[2]); break; default: break; } } else { LoadScene("1"); StartCoroutine(DeferredExecution(msg)); } } IEnumerator DeferredExecution(string msg) { yield return new WaitForSeconds(1); if (sceneRecording == "DongYing_Main") { switch (msg) { case "科技馆": Movement(GameManager.Instance.MainPos[0]); break; case "少年宫": Movement(GameManager.Instance.MainPos[1]); break; case "图书馆": Movement(GameManager.Instance.MainPos[2]); break; default: break; } } } // 不切换场景 /// /// 场景切换调用 /// /// public void LoadScene(string Type) { switch (Type) { case "1"://返回主场景 sceneName = "DongYing_Main"; break; case "2":// sceneName = "DongYing_Interior"; break; default: break; } StartCoroutine(LoadSceneAsync()); } /// /// 加载切换场景 /// /// private IEnumerator LoadSceneAsync() { // 开始异步加载场景 asyncOperation = SceneManager.LoadSceneAsync(sceneName); sceneRecording = sceneName; // 阻止场景在加载完毕后自动切换 asyncOperation.allowSceneActivation = false; // 等待场景加载完成 while (!asyncOperation.isDone) { // 当加载进度达到0.9时,表示场景已经加载完成 if (asyncOperation.progress >= 0.9f) { // 可以根据需要进行一些其他操作,如显示加载完成的提示等 // 延迟一段时间再切换场景,以确保加载完成的提示显示足够长的时间 yield return new WaitForSeconds(0.5f); // 手动激活场景切换 asyncOperation.allowSceneActivation = true; isOnLoad = false; // 跳出协程 yield break; } yield return null; } } /// /// 移动 /// /// public void Movement(Transform _movePos) { Debug.Log(_movePos.transform.name); Camera.main.transform.GetComponent().ShieldingOperation = true; Camera.main.transform.GetComponent().ResetTarget(); Camera.main.transform.DOMove(_movePos.position, 1).OnComplete(() => { Camera.main.transform.GetComponent().enabled = true; Camera.main.transform.GetComponent().Init(); }); Camera.main.transform.DORotate(_movePos.eulerAngles, 1); // 在这里编写你点击UI后的逻辑代码 } }