DongYingLiangGuanYiGong/DongYing/Assets/Zion/Scripts/wzx/SceneLoader.cs

310 lines
9.7 KiB
C#

using DG.Tweening;
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneLoader : MonoBehaviour
{
/// <summary>
/// 场景切换控制
/// </summary>
public static SceneLoader instance;
/// <summary>
/// 要加载的场景名称
/// </summary>
public string sceneName;
/// <summary>
/// 异步操作
/// </summary>
private AsyncOperation asyncOperation;
/// <summary>
/// 是否正在加载场景
/// </summary>
public bool isOnLoad = false;
/// <summary>
/// 记录当前场景
/// </summary>
public string sceneRecording = "DongYing_Main";
/// <summary>
///
/// </summary>
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
/// <summary>
/// 主场景
/// </summary>
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");
}
}
/// <summary>
/// 单个模型切换
/// </summary>
/// <param name="msg">配电房名称</param>
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;
}
}
}
/// <summary>
/// 大场景切换
/// </summary>
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;
}
}
}
// 不切换场景
/// <summary>
/// 场景切换调用
/// </summary>
/// <param name="Type"></param>
public void LoadScene(string Type)
{
switch (Type) {
case "1"://返回主场景
sceneName = "DongYing_Main";
break;
case "2"://
sceneName = "DongYing_Interior";
break;
default:
break;
}
StartCoroutine(LoadSceneAsync());
}
/// <summary>
/// 加载切换场景
/// </summary>
/// <returns></returns>
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;
}
}
/// <summary>
/// 移动
/// </summary>
/// <param name="vector"></param>
public void Movement(Transform _movePos)
{
Debug.Log(_movePos.transform.name);
Camera.main.transform.GetComponent<CameraMove>().ShieldingOperation = true;
Camera.main.transform.GetComponent<CameraMove>().ResetTarget();
Camera.main.transform.DOMove(_movePos.position, 1).OnComplete(() =>
{
Camera.main.transform.GetComponent<CameraMove>().enabled = true;
Camera.main.transform.GetComponent<CameraMove>().Init();
});
Camera.main.transform.DORotate(_movePos.eulerAngles, 1);
// 在这里编写你点击UI后的逻辑代码
}
}