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#
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);
|
|
}
|
|
}
|
|
|
|
} |