Files
Gen_Hack-and-Slash-Roguelite/Client/Assets/Scripts/Test/TestInit.cs

101 lines
3.4 KiB
C#
Raw Normal View History

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 Map.Landform landform;
private void Start()
{
Reload();
landform = Program.Instance.FocusedDimension?.landform;
}
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}");
// 可以选择忽略或者重新抛出
}
}
landform?.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}");
}
}
}
}