Unity如何设计一个技能系统以及buff系统

技能系统:

在Unity中制作完整的技能系统(介绍篇) - 知乎 (zhihu.com)

在Unity中制作完整的技能系统(代码篇) - 知乎 (zhihu.com)

Buff系统:

Unity实战篇:Buff系统设计(一:大体思路和思维导图)_烟雨迷离半世殇的博客-CSDN博客_buff系统设计

Unity实战篇:Buff系统设计(二:具体代码和实战使用)_烟雨迷离半世殇的博客-CSDN博客

技能系统思想:

每个玩家身上都有一个技能管理器,当中存放好了玩家所有的技能。玩家要释放技能时,管理器会通过调用对应技能释放器来执行技能数据中设置好的范围选择算法和效果算法(这里用到了释放器配置工厂),选择好规定范围中的敌人后赋予效果。

Buff系统思想:

1.能够被加上Buff的游戏物体,说明他在游戏中的地位已经相当重要,所以我们值得让他继承Mono
2.相对于集中管理的BuffManager,我倾向于每个游戏物体都是自己Buff的管理者,当自己被加上Buff的时候,自己要做出相应的反应
3.Buff有两个最基本的共同点 1.持续时间    2.Buff的种类
 

### 创建技能Buff 系统 #### 设计原则 为了确保系统的灵活性和可维护性,在设计过程中应遵循几个重要原则: - 技能多样性:每个角色拥有独特技能集,以适应不同游戏风格和策略[^1]。 - 平衡性和协同作用:保持各技能间的平衡并鼓励玩家间通过技能组合协作。 #### 组件化架构 采用组件化的思维方式来构建此系统。这不仅有助于提高代码质量,还能简化后续功能迭代过程中的工作量。具体来说,就是把每一个独立的功能模块都封装成单独的脚本文件,再利用Unity引擎提供的Inspector界面让用户直观地调整参数配置[^3]。 #### 数据驱动机制 引入数据表单(如JSON、CSV等),用于存储各类属性数值以及逻辑判断条件等内容;这样做可以让策划人员无需修改源码即可快速测试新想法的效果,并且降低了程序员与设计师之间的沟通成本。对于复杂的业务场景,则可以通过编写自定义编辑器窗口进一步优化用户体验。 #### 事件触发体系 建立一套完善的监听/广播模式,当满足特定前提时自动激活相应的处理流程——例如施放某个法术之后可能会给目标单位附加一层Debuff效果,此时就需要依靠消息传递机制通知其他对象做出响应动作。 #### 实现细节 ##### 基础类定义 先声明一个`BaseSkill.cs`作为所有实际操作行为的基础模板,其中包含了诸如冷却时间、消耗资源之类的公共成员变量及其getter/setter方法;另外还提供了两个虚函数供派生类覆写使用,分别是`CanUse()`用来检测当前状态下能否发动攻击,还有`DoEffect(GameObject target)`负责真正意义上的执行伤害计算或者状态改变等功能[^4]。 ```csharp using UnityEngine; public abstract class BaseSkill : MonoBehaviour { protected float cooldownTime; private bool isCoolingDown = false; public virtual bool CanUse(){ return !isCoolingDown && PlayerStatus.HasEnoughResource(); } public abstract void DoEffect(GameObject target); } ``` ##### 子类拓展 针对不同类型的动作需求分别创建对应的派生类型,像近程打击就可以继承上述基底然后重载部分关键环节达到差异化目的: ```csharp using System.Collections.Generic; using UnityEngine; public class MeleeAttack : BaseSkill{ private List<GameObject> targetsInRange; public override void DoEffect(GameObject target){ // 执行选区算法 CalculateTargets(); foreach(var t in targetsInRange){ // 对范围内敌人造成物理伤害 ApplyPhysicalDamage(t); // 如果命中了Boss级怪物的话还会额外附加流血debuff if (t.CompareTag("EliteEnemy")){ AddBleedingBuff(t, duration:5f,damagePerSecond:20f ); } } StartCoroutine(Cooldown()); } private IEnumerator Cooldown(){ isCoolingDown=true; yield return new WaitForSeconds(cooldownTime); isCoolingDown=false; } } ``` ##### Buff管理 最后关于增益减益方面的实现方式建议如下所示,即新建一个名为`BuffManager.cs`的服务端控制器专门负责接收来自外界的通知请求并将之转化为内部指令下发至各个实体身上生效。 ```csharp using System.Collections.Generic; using UnityEngine; public static class BuffManager { private static Dictionary<string,List<Buff>> activeEffects=new (); public static void RegisterNewEffect(string owner,Buff effect){ if(!activeEffects.ContainsKey(owner)){ activeEffects.Add(owner,new ()); } activeExtensions[owner].Add(effect); effect.StartTick(); } public static void UnregisterExpiredEffect(Buff expiredOne){ var key=expiredOne.OwnerId; if(activeEffects.TryGetValue(key,out var list)){ list.Remove(expiredOne); } } } [System.Serializable] public struct Buff{ [Header("基础信息")] public string OwnerId; public int Id; public string Name; public Sprite Icon; [Header("持续期间")] public float DurationInSeconds; public float TickIntervalInSeconds; [Header("强度系数")] public float Multiplier; /// <summary> /// 开始周期性的更新 /// </summary> public void StartTick(){ InvokeRepeating(nameof(Tick),this.TickIntervalInSeconds,this.TickIntervalInSeconds); } private void Tick(){ // 更新逻辑... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值