2
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
3.2 KiB
C#

using Entitas;
using System.Collections.Generic;
using UnityEngine;
using Game;
public class BuffSystem : IExecuteSystem, IInitializeSystem
{
private IGroup<GameEntity> _entities;
private List<string> _removeListTemp = new List<string>();
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);
}
}
}