vampire-like/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyRegistry.cs

86 lines
2.1 KiB
C#

using System.Collections.Generic;
using SepCore.Entity;
using UnityEngine;
namespace SepCore.EnemyManager
{
public class EnemyRegistry
{
private readonly List<EntityBase> _enemies;
private readonly Dictionary<int, EntityBase> _enemyById;
public int Count { get; private set; }
public List<EntityBase> Enemies => _enemies;
public EnemyRegistry()
{
_enemies = new List<EntityBase>();
_enemyById = new Dictionary<int, EntityBase>();
}
public void Register(EnemyBase enemy)
{
if (enemy == null) return;
Count++;
RemoveFromCache(enemy.Id);
_enemies.Add(enemy);
_enemyById[enemy.Id] = enemy;
}
public void Remove(int entityId)
{
if (Count > 0)
{
Count--;
}
RemoveFromCache(entityId);
}
public bool TryGet(int entityId, out EntityBase enemy)
{
enemy = null;
if (!_enemyById.TryGetValue(entityId, out EntityBase cachedEnemy))
{
return false;
}
if (cachedEnemy == null || !cachedEnemy.Available)
{
_enemyById.Remove(entityId);
return false;
}
enemy = cachedEnemy;
return true;
}
public void Clear()
{
_enemies.Clear();
_enemyById.Clear();
Count = 0;
}
private void RemoveFromCache(int entityId)
{
_enemyById.Remove(entityId);
for (int i = _enemies.Count - 1; i >= 0; i--)
{
EntityBase cachedEnemy = _enemies[i];
if (cachedEnemy == null || cachedEnemy.Id == entityId)
{
if (cachedEnemy != null)
{
_enemyById.Remove(cachedEnemy.Id);
}
_enemies.RemoveAt(i);
}
}
}
}
}