80 lines
2.2 KiB
C#
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|