90 lines
3.0 KiB
C#
90 lines
3.0 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using Cielonos.Core.UI;
|
||
using Cielonos.MainGame.Map;
|
||
using DG.Tweening;
|
||
using SLSUtilities.General;
|
||
using UnityEngine;
|
||
using UnityEngine.SceneManagement;
|
||
|
||
namespace Cielonos.MainGame
|
||
{
|
||
public partial class MapManager : Singleton<MapManager>
|
||
{
|
||
public MapBaseCollection baseCollection;
|
||
|
||
public ZoneData currentZoneData;
|
||
public ZoneManager currentZoneManager;
|
||
public int zoneIndex;
|
||
public List<ZoneData> zoneDataList;
|
||
|
||
public void Start()
|
||
{
|
||
zoneIndex = 0;
|
||
StartCoroutine(SwitchRoomRoutine(zoneDataList[zoneIndex++]));
|
||
}
|
||
|
||
public void GoToNextZone()
|
||
{
|
||
if (zoneIndex >= zoneDataList.Count)
|
||
{
|
||
Debug.Log("No more zones to load.");
|
||
return;
|
||
}
|
||
|
||
ScreenFader.Instance.FadeToBlack(onComplete : () => StartCoroutine(SwitchRoomRoutine(zoneDataList[zoneIndex++]))).Play();
|
||
}
|
||
}
|
||
|
||
public partial class MapManager
|
||
{
|
||
public static MapBaseCollection BaseCollection => Instance.baseCollection;
|
||
}
|
||
|
||
public partial class MapManager
|
||
{
|
||
public IEnumerator SwitchRoomRoutine(ZoneData nextZoneData) {
|
||
// 1. 发送转场开始事件 (UI显示遮挡,特效触发)
|
||
//EventManager.Trigger("OnTeleportStart");
|
||
|
||
// 2. 异步卸载旧场景
|
||
if (currentZoneData != null) {
|
||
yield return SceneManager.UnloadSceneAsync(currentZoneData.sceneName);
|
||
}
|
||
|
||
currentZoneData = nextZoneData;
|
||
|
||
// 3. 异步加载新场景
|
||
string nextSceneName = nextZoneData.sceneName;
|
||
AsyncOperation op = SceneManager.LoadSceneAsync(nextSceneName, LoadSceneMode.Additive);
|
||
op.allowSceneActivation = false; // 先不激活,等加载到90%
|
||
|
||
while (op.progress < 0.9f) {
|
||
yield return null;
|
||
}
|
||
|
||
op.allowSceneActivation = true; // 允许激活
|
||
yield return op; // 等待激活完成
|
||
|
||
// 4. 设置为活跃场景 (非常重要!)
|
||
Scene nextScene = SceneManager.GetSceneByName(nextSceneName);
|
||
SceneManager.SetActiveScene(nextScene);
|
||
|
||
// 5. 将玩家放到出生点
|
||
//Player.Instance.TeleportTo(FindObjectOfType<SpawnPoint>().transform.position);
|
||
|
||
yield return new WaitForEndOfFrame();
|
||
|
||
BattleManager.AttackAreaSm.Reset();
|
||
BattleManager.EnemySm.Reset();
|
||
MainGameManager.Player.transform.position = Vector3.zero;
|
||
ZoneManager.instance.SetupZone(currentZoneData);
|
||
// 6. 发送转场结束事件 (特效消失,UI关闭)
|
||
//EventManager.Trigger("OnTeleportEnd");
|
||
|
||
yield return new WaitForSeconds(0.5f);
|
||
ScreenFader.Instance.FadeToClear().Play();
|
||
}
|
||
}
|
||
} |