首先是Buff种类
public enum BuffKind
{
FreezeBuff = 1,
GodDefendBuff = 2,
SteelHeartBuff = 3,
}
BuffBase
public abstract class BuffBase
{
/// <summary>
/// Buff的类型
/// </summary>
public BuffKind m_BuffKind;
/// <summary>
/// 计时器
/// </summary>
public float timer;
/// <summary>
/// Buff持续时间,我们约定,Buff时间为0,则为瞬时Buff,只执行OnAdd
/// </summary>
public float m_Length;
/// <summary>
/// 所归属的实体
/// </summary>
public CostumEntityLogic m_CostumEntityLogic;
public BuffBase(CostumEntityLogic costumEntityLogic, BuffKind buffKind, float length)
{
m_CostumEntityLogic = costumEntityLogic;
m_Length = length;
m_BuffKind = buffKind;
timer = 0;
}
/// <summary>
/// 当添加到实体时执行逻辑
/// </summary>
public virtual void OnAdd()
{
}
/// <summary>
/// 跟随实体每帧更新
/// </summary>
public virtual void OnUpdate()
{
}
/// <summary>
/// 当从实体移除时
/// </summary>
public virtual void OnRemove()
{
}
}
CostumEntityLogic
/// <summary>
/// 为了添加Buff设计的自定义EntityLogic
/// </summary>
public class CostumEntityLogic : MonoBehaviour
{
public List<BuffBase> m_Buffs = new List<BuffBase>();
/// <summary>
/// 被冰冻
/// </summary>
public bool IsFreeze { get; set; }
/// <summary>
/// 是否处于无敌状态
/// </summary>
public bool IsGodDefend { get; set; }
/// <summary>
/// 得到无敌状态
/// </summary>
public virtual void GetGodDefend()
{
}
/// <summary>
/// 失去无敌状态
/// </summary>
public virtual void LoseGodDefend()
{
}
/// <summary>
/// 得到钢铁之心状态
/// </summary>
public virtual void GetSteelHeart()
{
}
/// <summary>
/// 失去钢铁之心状态
/// </summary>
public virtual void LoseSteelHeart()
{
}
public void AddBuff(BuffBase buffNeed2Add)
{
m_Buffs.Add(buffNeed2Add);
buffNeed2Add.OnAdd();
}
private void Update()
{
ReFreshBuff();
}
public void ReFreshBuff()
{
for (int i = m_Buffs.Count - 1; i >= 0; i--)
{
m_Buffs[i].OnUpdate();
}
}
public void RemoveBuff(BuffBase buffNeed2Remove)
{
m_Buffs.Remove(buffNeed2Remove);
buffNeed2Remove.OnRemove();
}
}
这里我们以冰冻Buff为例
/// <summary>
/// 冰冻Buff
/// </summary>
public class FreezeBuff : BuffBase
{
public FreezeBuff(CostumEntityLogic costumEntityLogic, BuffKind buffKind, float length) : base(costumEntityLogic, buffKind,
length)
{
}
public override void OnAdd()
{
base.OnAdd();
m_CostumEntityLogic.IsFreeze = true;
}
public override void OnUpdate()
{
base.OnUpdate();
if (timer >= m_Length)
{
m_CostumEntityLogic.IsFreeze = false;
m_CostumEntityLogic.RemoveBuff(this);
}
timer += Time.fixedDeltaTime;
}
public override void OnRemove()
{
base.OnRemove();
GC.Collect();
}
}
当我们吃到冰冻道具
我们给具体的怪物类加上时长为1.5秒的冰冻Buff,这样他在Buff持续时间内就不会动了
AddBuff(new FreezeBuff(this, BuffKind.FreezeBuff, 1.5f));
关于更多本Buff系统,可以去看我在码云的开源项目,重制版坦克大战(因为使用了GF框架,所以大家可以忽略其他部分的代码,只看Buff系统部分的),欢迎大家提建议