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

101 lines
3.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}");
}
}
}
}