当前位置: 首页 > news >正文

2.游戏中的Buff系统设计

1.分析游戏中的Buff系统

2.Buff系统的类结构

3.游戏中存在很多种buff, 是否需要创建不同的buff实体


1.分析游戏中的Buff系统

a.Buff系统的类结构b.游戏中存在很多种buff, 是否需要创建不同的buff实体

2.Buff系统的类结构

将Buff分为三个部分: 数据, 行为, 表现a.Buff数据(BuffData): 定义Buff的静态属性, 如BuffID、持续时间、效果类型、效果值等; 这些数据可以从配置表读取b.Buff实例(BuffInstance): 每个Buff在角色身上的一个实例, 它包含动态数据, 如剩余时间、层数等, 并持有对BuffData的引用c.Buff行为(BuffBehavior): 负责Buff的效果逻辑, 如应用效果、移除效果、定时更新等; 这部分可以放在BuffInstance中也可以分离出来d.Buff表现(BuffView): 负责Buff的视觉和听觉表现, 如特效、音效等; 这部分应该与行为分离, 通过监听Buff的状态变化来触发表现

// Buff事件系统
public class BuffEvent
{public static event Action<Buff, GameObject> OnBuffApply;public static event Action<Buff, GameObject> OnBuffRefresh; public static event Action<Buff, GameObject> OnBuffRemove;public static event Action<Buff, GameObject> OnBuffExpire;public static void TriggerApply(Buff buff, GameObject target) => OnBuffApply?.Invoke(buff, target);// ... 其他触发方法
}// 简化的Buff基类
public abstract class Buff
{public BuffData Data { get; protected set; }public virtual void Apply(GameObject target){// 业务逻辑BuffEvent.TriggerApply(this, target);}public virtual void Remove(GameObject target){// 业务逻辑BuffEvent.TriggerRemove(this, target);}
}// 独立的Buff表现控制器
public class BuffVisualController : MonoBehaviour
{private Dictionary<Buff, GameObject> activeVisuals = new Dictionary<Buff, GameObject>();private void OnEnable(){BuffEvent.OnBuffApply += OnBuffApplied;BuffEvent.OnBuffRemove += OnBuffRemoved;BuffEvent.OnBuffRefresh += OnBuffRefreshed;}private void OnDisable(){BuffEvent.OnBuffApply -= OnBuffApplied;BuffEvent.OnBuffRemove -= OnBuffRemoved;BuffEvent.OnBuffRefresh -= OnBuffRefreshed;}private void OnBuffApplied(Buff buff, GameObject target){// 播放获得特效PlayOneShotEffect(buff.Data.applyEffect, target.transform);// 开始持续特效if(buff.Data.loopEffect != null){var effect = Instantiate(buff.Data.loopEffect, target.transform);activeVisuals[buff] = effect;}// 更新UI图标等UIManager.Instance.ShowBuffIcon(buff);}private void OnBuffRemoved(Buff buff, GameObject target){// 播放消失特效PlayOneShotEffect(buff.Data.removeEffect, target.transform);// 停止持续特效if(activeVisuals.TryGetValue(buff, out var effect)){Destroy(effect);activeVisuals.Remove(buff);}// 移除UI图标UIManager.Instance.HideBuffIcon(buff);}private void OnBuffRefreshed(Buff buff, GameObject target){// 播放刷新特效(如闪光一下)PlayOneShotEffect(buff.Data.refreshEffect, target.transform);}
}

3.游戏中存在很多种buff, 是否需要创建不同的buff实体

a.继承体系: 创建一个抽象的Buff基类, 然后为每种不同类型的Buff创建子类; 这种方式直观, 但当Buff行为复杂且组合多变时, 会导致类层次过深或子类数量过多b.组件化(策略模式): 将Buff的行为拆分成多个组件(例如:效果应用、持续时间管理、叠加规则等), 然后通过组合这些组件来构建不同的Buff; 这种方式更灵活, 易于扩展

将Buff的行为拆分为多个可组合的部分a.效果(IEffect): 定义Buff的具体效果, 如伤害、修改属性等b.持续时间(IDuration): 管理Buff的持续时间c.叠加规则(IStacking): 定义Buff如何叠加
public interface IEffect
{void OnApply(GameObject target);void OnUpdate(GameObject target, float deltaTime);void OnRemove(GameObject target);
}public interface IDuration
{float Duration { get; set; }bool IsExpired { get; }void Update(float deltaTime);
}public interface IStacking
{int Stacks { get; set; }void Stack(Buff buff);
}public class Buff
{public GameObject Target { get; private set; }public IEffect Effect { get; private set; }public IDuration Duration { get; private set; }public IStacking Stacking { get; private set; }public Buff(IEffect effect, IDuration duration, IStacking stacking){Effect = effect;Duration = duration;Stacking = stacking;}public void Apply(GameObject target){Target = target;Effect.OnApply(target);}public void Update(float deltaTime){Duration.Update(deltaTime);Effect.OnUpdate(Target, deltaTime);}public void Remove(){Effect.OnRemove(Target);}public void Stack(Buff other){Stacking.Stack(other);}
}// 具体效果实现
public class DamageOverTimeEffect : IEffect
{private float tickInterval;private float timeSinceLastTick;private float damagePerTick;public DamageOverTimeEffect(float tickInterval, float damagePerTick){this.tickInterval = tickInterval;this.damagePerTick = damagePerTick;timeSinceLastTick = 0f;}public void OnApply(GameObject target) { }public void OnUpdate(GameObject target, float deltaTime){timeSinceLastTick += deltaTime;if (timeSinceLastTick >= tickInterval){Health health = target.GetComponent<Health>();if (health != null){health.TakeDamage(damagePerTick);}timeSinceLastTick = 0f;}}public void OnRemove(GameObject target) { }
}// 具体持续时间实现
public class FixedDuration : IDuration
{public float Duration { get; set; }public bool IsExpired => Duration <= 0f;public FixedDuration(float duration){Duration = duration;}public void Update(float deltaTime){Duration -= deltaTime;}
}// 具体叠加规则实现
public class SimpleStacking : IStacking
{public int Stacks { get; set; } = 1;public void Stack(Buff other){// 简单叠加:层数+1,刷新持续时间Stacks++;if (other.Duration is FixedDuration fixedDuration){// 刷新持续时间,例如:重置为初始持续时间// 这里需要知道初始持续时间,所以可能需要扩展设计}}
}
http://www.dtcms.com/a/481755.html

相关文章:

  • 解锁网络性能优化利器HTTP/2C
  • 基于 React + Go + PostgreSQL + Redis 的管理系统开发框架
  • Flink Checkpoint 设计理念深度解析(附源码)
  • 从 TF-IDF 到 Word2Vec:让推荐系统更懂语义
  • 01-ELK安装ES,ES-head
  • OpenCV4-直方图与傅里叶变换-项目实战-信用卡数字识别
  • 医院排班挂号系统小程序
  • 河北建设厅网站打不开是什么原因国际新闻直播
  • C++设计模式_行为型模式_命令模式Command
  • Blender自动化展UV插件 UV Factory 4.3 v1 – Powerful Modular Uv Tools
  • 网络与通信安全课程复习汇总2——信息保密
  • 密码学安全:CIA三元组与三大核心技术
  • 建网站怎么做本地的营销网站建设
  • 短剧分销系统技术拆解:渠道推广码生成、订单归因与实时分账系统实现
  • ​RocketMQ 与 RabbitMQ 全面对比:架构、性能与适用场景解析
  • RabbitMQ 消息可靠投递
  • RabbitMQ全面详解:从核心概念到企业级应用
  • 北京市建设工程第四检测所网站小程序定制开发团队
  • 安徽网站优化flash如何做网页
  • AI文档处理:AI在处理扫描版PDF时准确率低,如何提升?
  • TDengine 数学函数 EXP 用户手册
  • C语言自定义变量类型结构体理论:从初见到精通​​​​​​​(下)
  • 医疗网络功能虚拟化与深度强化学习的动态流量调度优化研究(下)
  • SpringMVC练习:加法计算器与登录
  • 小模型的应用
  • 深度学习进阶(一)——从 LeNet 到 Transformer:卷积的荣光与注意力的崛起
  • QPSK信号载波同步技术---极性Costas 法载波同步
  • 盘多多网盘搜索苏州seo排名公司
  • 国外有趣的网站wordpress小视频主题
  • RTC、UDP、TCP和HTTP以及直播等区别