Frame/Assets/Scripts/Dinosaurs/Boss/IBossManager.cs

80 lines
2.2 KiB
C#

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<IBoss> bosses { get; }
IBFSManager bfsManager { get; }
UniTask MoveToKillPlayerAsync(IReadOnlyList<IRoom> rooms, CancellationToken token);
void DeleteBoss();
}
public class BossManager : ManagerBase, IBossManager
{
private List<IBoss> _bosses;
private IBFSManager _bfsManager;
private string bossAssetName = AssetConstPath.Assets_GameRes_Prefabs_Role_boss1;
public IReadOnlyList<IBoss> bosses => this._bosses;
public IBFSManager bfsManager => this._bfsManager;
public BossManager(IBFSManager bfsManager)
{
this._bfsManager = bfsManager;
}
public async UniTask MoveToKillPlayerAsync(IReadOnlyList<IRoom> rooms, CancellationToken token)
{
this._bosses = new List<IBoss>();
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<UniTask> uniTasks = new List<UniTask>();
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;
}
}
}