首先是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系统部分的),欢迎大家提建议
https://blog.csdn.net/_/article/details/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/34982.html