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

126 lines
3.4 KiB
C#
Raw Normal View History

2023-12-14 14:42:27 +08:00
using System.Collections.Generic;
namespace Gameplay.Unit.Data
{
public class UnitContainer
{
2023-12-15 15:12:01 +08:00
private readonly List<GameUnit> _unitList = new List<GameUnit>();
private readonly Dictionary<uint, GameUnit> _unitDict = new Dictionary<uint, GameUnit>();
2024-11-15 14:32:41 +08:00
private readonly Dictionary<int, GameUnit> _unitLocalIdDict = new Dictionary<int, GameUnit>();
2023-12-14 14:42:27 +08:00
2023-12-14 19:10:53 +08:00
public List<GameUnit> unitList
{
get
{
return _unitList;
}
}
public int count { get; private set; }
2023-12-14 14:42:27 +08:00
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++;
2023-12-25 19:00:08 +08:00
_OnAdd(unit);
}
protected virtual void _OnAdd(GameUnit unit)
{
2023-12-14 14:42:27 +08:00
}
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--;
2023-12-25 19:00:08 +08:00
_OnRemove(unit);
}
protected virtual void _OnRemove(GameUnit unit)
{
2023-12-14 14:42:27 +08:00
}
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--;
2023-12-25 19:00:08 +08:00
_OnRemove(unit);
2023-12-14 14:42:27 +08:00
}
2023-12-14 19:10:53 +08:00
public bool Contains(uint guid)
{
return _unitDict.ContainsKey(guid);
}
2023-12-14 14:42:27 +08:00
public GameUnit Search(uint guid)
{
if (_unitDict.TryGetValue(guid, out var unit))
{
return unit;
}
2023-12-14 15:31:46 +08:00
DebugUtil.LogError("不存在指定guid的单位:{0}", guid);
2023-12-14 14:42:27 +08:00
return null;
}
2024-11-15 14:32:41 +08:00
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;
}
2023-12-14 14:42:27 +08:00
public GameUnit GetByIndex(int index)
{
if (index < 0 || index >= _unitList.Count) {
2023-12-14 15:31:46 +08:00
DebugUtil.LogError("不存在指定index的单位:{0}", index);
2023-12-14 14:42:27 +08:00
return null;
}
return _unitList[index];
}
2024-02-20 14:33:52 +08:00
public void Clear()
{
_unitDict.Clear();
_unitList.Clear();
count = 0;
}
2023-12-14 14:42:27 +08:00
}
}