NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Buff/BuffManager.cs

301 lines
8.7 KiB
C#
Raw Normal View History

2025-03-10 13:11:12 +08:00
using System.Collections.Generic;
2024-09-09 19:22:22 +08:00
using Gameplay.Building;
2023-10-19 15:00:19 +08:00
using Gameplay.Pool;
2024-03-13 13:15:12 +08:00
using Gameplay.Summon;
2023-12-13 16:20:41 +08:00
using Gameplay.Unit;
using Gameplay.Unit.Data;
2023-08-22 19:08:45 +08:00
using Gameplay.Vehicle.Impl;
namespace Gameplay.Buff
{
using cfg.BuffCfg;
using Framework;
2023-10-19 15:00:19 +08:00
using Bullet;
using Character;
using Skill;
2023-08-22 19:08:45 +08:00
public class BuffManager
{
private const int EXPECTED_MAX_UNITS = 50;
private const int EXPECTED_MAX_SIDES = 4;
2023-08-22 19:08:45 +08:00
private static BuffManager _instance;
public static BuffManager instance
{
get
{
if (_instance == null)
{
DebugUtil.LogError("Buff尚未初始化,请先初始化");
return null;
}
2023-08-22 19:08:45 +08:00
return _instance;
}
}
public static BuffManager CreateInstance()
{
if (_instance != null)
{
DebugUtil.LogError("请勿重复创建BuffManager");
return _instance;
}
_instance = new BuffManager();
return _instance;
}
2024-02-20 15:17:22 +08:00
private Dictionary<GameUnit, UnitBuffManager> _unitDict;
private List<UnitBuffManager> _unitList;
private Dictionary<int, SideBuffManager> _sideBuffManagerDict;
2023-11-15 15:20:43 +08:00
// 缓存最后访问的管理器以优化查找
private UnitBuffManager _lastAccessedManager;
private GameUnit _lastAccessedUnit;
2023-08-22 19:08:45 +08:00
private BuffManager()
{
_unitDict = new Dictionary<GameUnit, UnitBuffManager>(EXPECTED_MAX_UNITS);
_unitList = new List<UnitBuffManager>(EXPECTED_MAX_UNITS);
_sideBuffManagerDict = new Dictionary<int, SideBuffManager>(EXPECTED_MAX_SIDES);
2023-08-22 19:08:45 +08:00
}
public void Init()
{
2023-10-19 15:00:19 +08:00
DebugUtil.Log("[Init]------BuffManager");
2023-12-19 13:28:41 +08:00
2023-11-16 12:27:59 +08:00
EventManager.Instance.Register<GameUnit>(EventManager.EventName.INFIGHT_UNIT_READY, _OnUnitReady);
EventManager.Instance.Register<GameUnit>(EventManager.EventName.INFIGHT_UNIT_REMOVE, _OnUnitRemove);
2023-08-22 19:08:45 +08:00
}
2023-12-19 13:28:41 +08:00
public void Dispose()
2023-10-19 15:00:19 +08:00
{
DebugUtil.Log("[Dispose]------BuffManager");
2023-12-19 13:28:41 +08:00
2023-11-16 12:27:59 +08:00
EventManager.Instance.Unregister<GameUnit>(EventManager.EventName.INFIGHT_UNIT_READY, _OnUnitReady);
EventManager.Instance.Unregister<GameUnit>(EventManager.EventName.INFIGHT_UNIT_REMOVE, _OnUnitRemove);
2024-03-13 13:15:12 +08:00
// 清理缓存
_lastAccessedManager = null;
_lastAccessedUnit = null;
2024-02-20 15:17:22 +08:00
_unitDict.Clear();
_unitList.Clear();
_sideBuffManagerDict.Clear();
2024-03-13 13:15:12 +08:00
2024-02-20 15:17:22 +08:00
_unitDict = null;
_unitList = null;
_sideBuffManagerDict = null;
2024-03-13 13:15:12 +08:00
_instance = null;
2023-10-19 15:00:19 +08:00
}
2023-11-16 12:27:59 +08:00
private void _OnUnitReady(GameUnit unit)
{
var troopId = unit.commonData.troopId;
var sideBuffManager = GetSideBuffManager(troopId);
sideBuffManager.AddToUnit(unit);
}
private void _OnUnitRemove(GameUnit unit)
{
var troopId = unit.commonData.troopId;
var sideBuffManager = GetSideBuffManager(troopId);
sideBuffManager.RemoveFromUnit(unit);
}
2023-10-19 15:00:19 +08:00
public static DataBuff GetBuffConfigById(int id)
2023-08-22 19:08:45 +08:00
{
return TableManager.Instance.Tables.BuffConfig.Get(id);
}
public BaseBuff CreateBuffById(GameUnit creator, int id)
2023-08-22 19:08:45 +08:00
{
var buffConfig = GetBuffConfigById(id);
2024-07-09 18:09:24 +08:00
if (buffConfig == null)
{
return null;
}
return CreateBuffByConfig(creator, buffConfig);
}
public BaseBuff CreateBuffByConfig(GameUnit creator, DataBuff buffConfig)
2024-07-09 18:09:24 +08:00
{
var buff = BuffFactory.CreateBuff(buffConfig.BuffType);
2024-03-25 19:10:22 +08:00
if (buff == null)
2023-08-22 19:08:45 +08:00
{
2024-03-25 19:10:22 +08:00
return null;
2023-10-19 15:00:19 +08:00
}
2024-03-25 19:10:22 +08:00
buff.Ctor(creator, buffConfig);
2023-08-22 19:08:45 +08:00
return buff;
}
2023-10-19 15:00:19 +08:00
public static void ReturnBuff<T>(T buff) where T : BaseBuff
{
ObjPoolManager.instance.Return(buff);
}
public void AddBuff(GameUnit unit, BaseBuff buff)
2023-08-22 19:08:45 +08:00
{
if (buff == null || unit == null)
{
return;
}
UnitBuffManager unitManager;
// 使用缓存避免字典查找
if (_lastAccessedUnit == unit)
2024-11-15 20:00:42 +08:00
{
unitManager = _lastAccessedManager;
}
else if (_unitDict.TryGetValue(unit, out unitManager))
{
// 更新缓存
_lastAccessedUnit = unit;
_lastAccessedManager = unitManager;
}
else
{
// 此unit已经从战场中移除
2024-11-15 20:00:42 +08:00
return;
}
2023-08-22 19:08:45 +08:00
switch (unit.gameunitType)
{
case EGameUnitType.Character:
case EGameUnitType.Vehicle:
2024-03-13 13:15:12 +08:00
case EGameUnitType.Summon:
2024-09-09 19:22:22 +08:00
case EGameUnitType.Building:
unitManager.AddBuff(buff);
2023-08-22 19:08:45 +08:00
break;
default:
2024-03-13 13:15:12 +08:00
DebugUtil.LogError("暂未实现的gameunit类型:{0}", unit.gameunitType);
2023-08-22 19:08:45 +08:00
break;
}
}
private void InitUnitCommon(GameUnit unit)
2024-09-09 19:22:22 +08:00
{
if (_unitDict.ContainsKey(unit))
2024-09-09 19:22:22 +08:00
{
DebugUtil.LogError($"FATAL ERROR: 不应该出现两个相同的{unit.GetType().Name}");
2024-09-09 19:22:22 +08:00
return;
}
var unitManager = new UnitBuffManager(unit);
_unitDict.Add(unit, unitManager);
2023-08-22 19:08:45 +08:00
_unitList.Add(unitManager);
// 更新缓存
_lastAccessedUnit = unit;
_lastAccessedManager = unitManager;
2023-08-22 19:08:45 +08:00
}
public void InitCharacter(Character c)
{
InitUnitCommon(c);
if (!_unitDict.TryGetValue(c, out var unitManager))
2023-08-22 19:08:45 +08:00
{
return;
}
2023-11-15 16:09:10 +08:00
// 默认全局buff
2023-10-19 15:00:19 +08:00
var autoRecoverMoraleBuff = CreateBuffById(c, InnerBuffID.AUTO_RECOVER_MORALE);
2023-08-22 19:08:45 +08:00
unitManager.AddBuff(autoRecoverMoraleBuff);
// 添加默认被动buff
var passiveBuffIds = c.runtimeData.configData.passiveBuffIds;
unitManager.AddBuffByIds(passiveBuffIds);
2023-08-22 19:08:45 +08:00
// 双向绑定
c.buffManager = unitManager;
}
public void InitBuild(UnitBuild build)
{
InitUnitCommon(build);
if (!_unitDict.TryGetValue(build, out var unitManager))
{
return;
}
// 双向绑定
build.buffManager = unitManager;
}
public void InitVehicle(NormalVehicle vehicle)
{
InitUnitCommon(vehicle);
if (!_unitDict.TryGetValue(vehicle, out var unitManager))
{
return;
}
// 双向绑定
vehicle.buffManager = unitManager;
}
2024-03-13 13:15:12 +08:00
public void InitSummon(BaseSummon summon)
{
InitUnitCommon(summon);
if (!_unitDict.TryGetValue(summon, out var unitManager))
2024-03-13 13:15:12 +08:00
{
return;
}
2024-03-25 19:10:22 +08:00
2024-03-13 13:15:12 +08:00
// 双向绑定
summon.buffManager = unitManager;
}
2023-08-22 19:08:45 +08:00
public void RemoveCharacter(Character c)
{
if (!_unitDict.ContainsKey(c))
{
DebugUtil.LogError("FATAL ERROR: 不应该出现不存在的character");
2023-08-22 19:08:45 +08:00
return;
}
var unitManager = _unitDict[c];
_unitDict.Remove(c);
_unitList.Remove(unitManager);
}
2023-11-16 12:27:59 +08:00
public SideBuffManager GetSideBuffManager(int troopId)
{
if (_sideBuffManagerDict.TryGetValue(troopId, out var sideBuffManager))
{
return sideBuffManager;
}
sideBuffManager = new SideBuffManager(troopId);
_sideBuffManagerDict.Add(troopId, sideBuffManager);
return sideBuffManager;
}
2023-08-22 19:08:45 +08:00
public void LogicUpdate(float dt)
{
// 快速返回
if (_unitList == null || _unitList.Count == 0)
2023-08-22 19:08:45 +08:00
{
return;
}
// 缓存列表大小和暂停状态
int count = _unitList.Count;
bool isPaused = SkillManager.instance.needSkillPaused;
for (var i = 0; i < count; ++i)
{
var unit = _unitList[i];
if (isPaused)
2024-08-02 16:06:25 +08:00
{
unit.UpdateOnlyRemoveAdd();
}
else
2024-08-02 16:06:25 +08:00
{
unit.LogicUpdate(dt);
}
2023-08-22 19:08:45 +08:00
}
}
}
}