using Entitas; using System.Collections.Generic; using UnityEngine; using Game; public class BuffSystem : IExecuteSystem, IInitializeSystem { private IGroup _entities; private List _removeListTemp = new List(); public void Initialize() { _entities = Util.GetGroup(GameMatcher.Buff); } public void Execute() { foreach (var entity in _entities) { if (Util.IsPause(entity)) { continue; } UpdateBuff(entity);//更新buff } } public void UpdateBuff(GameEntity entity) { var buff = entity.buff; _removeListTemp.Clear(); foreach (var item in buff.BuffMap) { var buffItem = item.Value; var cfg = buffItem.BuffCfg; switch (buffItem.State) { case EState.Enter: UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.LevelUp); buffItem.State = EState.Update; break; case EState.Update: if (buffItem.TimeLeft.Value == -1) { //永久存在的buff UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.During); continue; } var timePast = Mathf.Min(Time.deltaTime, buffItem.TimeLeft.Value); var updateRate = buffItem.BuffCfg.Buff.UpdateRate; buffItem.TimeLeft.Value -= timePast; if (updateRate > 0) { buffItem.TimePast += timePast; var updateTimes = (int)(buffItem.TimePast / updateRate); buffItem.TimePast -= updateTimes * updateRate; for (int i = 0; i < updateTimes; i++) { UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.During); } } else { UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.During); } if (buffItem.TimeLeft.Value == 0) { buffItem.State = EState.Leave; } break; case EState.Leave: buffItem.Level.Value--; UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.LevelDown); if (buffItem.Level.Value <= 0) { UtilBuff.BuffEffect(buffItem, EBuffEffectTimingType.Leave); _removeListTemp.Add(item.Key); } else { buffItem.State = EState.Update; buffItem.TimeLeft.Value = buffItem.TimeMax; buffItem.TimePast = 0; } break; } } foreach (var key in _removeListTemp) { buff.BuffMap.Remove(key); } } }