mirror of
http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite.git
synced 2025-11-20 02:37:12 +08:00
Co-authored-by: m0_75251201 <m0_75251201@noreply.gitcode.com> Reviewed-on: http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite/pulls/56
101 lines
3.4 KiB
C#
101 lines
3.4 KiB
C#
using System;
|
||
using System.Threading.Tasks;
|
||
using Managers;
|
||
using UI;
|
||
using UnityEngine;
|
||
using Map;
|
||
|
||
namespace Test
|
||
{
|
||
public class TestInit : MonoBehaviour
|
||
{
|
||
public SkillTreeUI skillTreePageUI;
|
||
|
||
private Task _currentMapGenerationTask = Task.CompletedTask; // 初始化为已完成任务
|
||
private readonly object _mapGenerationLock = new object();
|
||
public MapGenerator mapGenerator;
|
||
|
||
private void Start()
|
||
{
|
||
Reload();
|
||
mapGenerator = Program.Instance.FocusedDimension?.mapGenerator;
|
||
}
|
||
|
||
public async void Reload() // Make Reload async to await the previous task
|
||
{
|
||
// 在清理之前,等待任何正在进行的地图生成任务完成
|
||
// 注意:这会使 Reload() 异步,并且在等待期间 UI 可能会被阻塞,
|
||
// 或者如果你不await,后续代码可能在任务完成前执行。
|
||
Task oldMapTask;
|
||
lock (_mapGenerationLock)
|
||
{
|
||
oldMapTask = _currentMapGenerationTask;
|
||
}
|
||
|
||
if (!oldMapTask.IsCompleted)
|
||
{
|
||
Debug.Log("TestInit: 等待之前的地图生成任务完成,然后再进行清理和新生成...");
|
||
try
|
||
{
|
||
await oldMapTask; // 等待之前的任务完成
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Debug.LogWarning($"TestInit: 之前的地图生成任务在等待时失败: {ex.Message}");
|
||
// 可以选择忽略或者重新抛出
|
||
}
|
||
}
|
||
|
||
mapGenerator?.Clear();
|
||
|
||
// --- 清理和初始化阶段 ---
|
||
DefineManager.Instance.Clear();
|
||
PackagesImageManager.Instance.Clear();
|
||
TileManager.Instance.Clear();
|
||
|
||
DefineManager.Instance.Init();
|
||
PackagesImageManager.Instance.Init();
|
||
TileManager.Instance.Init();
|
||
// --- 清理和初始化阶段结束 ---
|
||
|
||
// 启动新的地图生成任务
|
||
StartNewMapGeneration(); // 这是一个非 async 的包装方法
|
||
}
|
||
|
||
/// <summary>
|
||
/// 启动新的地图生成任务,并更新 _currentMapGenerationTask。
|
||
/// </summary>
|
||
private void StartNewMapGeneration()
|
||
{
|
||
lock (_mapGenerationLock)
|
||
{
|
||
_currentMapGenerationTask = InitializeMapGenerationAsync();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 异步初始化并应用所有地图生成器。
|
||
/// </summary>
|
||
private async Task InitializeMapGenerationAsync()
|
||
{
|
||
try
|
||
{
|
||
// 异步应用地图生成器,并且按顺序等待它们完成
|
||
await TileManager.Instance.ApplyMapGenerator("DefaultMapGenerator");
|
||
// await TileManager.Instance.ApplyMapGenerator("WaterMapGenerator");
|
||
await TileManager.Instance.ApplyMapGenerator("TreeGenerator");
|
||
|
||
Debug.Log("TestInit: 所有地图生成器已成功应用并完成。");
|
||
}
|
||
catch (OperationCanceledException)
|
||
{
|
||
Debug.LogWarning("TestInit: 地图生成任务被取消。");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Debug.LogError($"TestInit: 在地图生成过程中发生未处理的错误: {ex.Message}");
|
||
}
|
||
}
|
||
}
|
||
}
|