310 lines
9.7 KiB
C#
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后的逻辑代码
|
|
}
|
|
}
|