using System.Collections.Generic; using System.Threading; using Cysharp.Threading.Tasks; using Game.Pathfinding; using Game.Room; using UnityEngine; namespace Game.Boss { public interface IBossManager { IReadOnlyList bosses { get; } IBFSManager bfsManager { get; } UniTask MoveToKillPlayerAsync(IReadOnlyList rooms, CancellationToken token); void DeleteBoss(); } public class BossManager : ManagerBase, IBossManager { private List _bosses; private IBFSManager _bfsManager; private string bossAssetName = AssetConstPath.Assets_GameRes_Prefabs_Role_boss1; public IReadOnlyList bosses => this._bosses; public IBFSManager bfsManager => this._bfsManager; public BossManager(IBFSManager bfsManager) { this._bfsManager = bfsManager; } public async UniTask MoveToKillPlayerAsync(IReadOnlyList rooms, CancellationToken token) { this._bosses = new List(); foreach (var room in rooms) { var gameObject = Game.resourceManager.LoadGameObjectSync(bossAssetName); IBoss boss = new Boss(gameObject, room, this._bfsManager); boss.Init(); _bosses.Add(boss); } List uniTasks = new List(); foreach (var boss in this._bosses) { var uniTask = boss.WaitMoveRoomAndKillAsync(token); uniTasks.Add(uniTask); await UniTask.Delay(100); } await UniTask.WhenAll(uniTasks); } public void DeleteBoss() { foreach (var boss in this._bosses) { boss.Dispose(); } this._bosses.Clear(); } protected override void OnDispose() { base.OnDispose(); if (this._bosses != null) foreach (var boss in this._bosses) { boss.Dispose(); } this._bfsManager = null; this._bosses = null; } } }