NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/Data/UnitContainer.cs

126 lines
3.4 KiB
C#

using System.Collections.Generic;
namespace Gameplay.Unit.Data
{
public class UnitContainer
{
private readonly List<GameUnit> _unitList = new List<GameUnit>();
private readonly Dictionary<uint, GameUnit> _unitDict = new Dictionary<uint, GameUnit>();
private readonly Dictionary<int, GameUnit> _unitLocalIdDict = new Dictionary<int, GameUnit>();
public List<GameUnit> unitList
{
get
{
return _unitList;
}
}
public int count { get; private set; }
public void Add(GameUnit unit)
{
var guid = unit.GetID();
if (_unitDict.ContainsKey(guid))
{
DebugUtil.LogError("已存在相同guid的单位:{0}", guid);
return;
}
_unitDict.Add(guid, unit);
_unitList.Add(unit);
count++;
_OnAdd(unit);
}
protected virtual void _OnAdd(GameUnit unit)
{
}
public void Remove(GameUnit unit)
{
var guid = unit.GetID();
if (!_unitDict.ContainsKey(guid))
{
DebugUtil.LogError("不存在相同guid的单位:{0}", guid);
return;
}
_unitDict.Remove(guid);
_unitList.Remove(unit);
count--;
_OnRemove(unit);
}
protected virtual void _OnRemove(GameUnit unit)
{
}
public void RemoveAt(int index)
{
if (index < 0 || index >= _unitList.Count) {
DebugUtil.LogError("不存在相同index的单位:{0}", index);
return;
}
var unit = _unitList[index];
_unitDict.Remove(unit.GetID());
_unitList.RemoveAt(index);
count--;
_OnRemove(unit);
}
public bool Contains(uint guid)
{
return _unitDict.ContainsKey(guid);
}
public GameUnit Search(uint guid)
{
if (_unitDict.TryGetValue(guid, out var unit))
{
return unit;
}
DebugUtil.LogError("不存在指定guid的单位:{0}", guid);
return null;
}
public GameUnit SearchByLocalId(int localId)
{
if (_unitLocalIdDict.TryGetValue(localId, out var unit))
{
return unit;
}
// 没找到,遍历一次
for (int i = 0; i < unitList.Count; i++)
{
var searchUnit = unitList[i];
if (searchUnit.unitLevelData == null)
{
continue;
}
if (searchUnit.unitLevelData.LocalId == localId)
{
_unitLocalIdDict.Add(localId, searchUnit);
return searchUnit;
}
}
return null;
}
public GameUnit GetByIndex(int index)
{
if (index < 0 || index >= _unitList.Count) {
DebugUtil.LogError("不存在指定index的单位:{0}", index);
return null;
}
return _unitList[index];
}
public void Clear()
{
_unitDict.Clear();
_unitList.Clear();
count = 0;
}
}
}