最近在考虑怎么写游戏中人物的技能与buff状态,在一些论坛里搜索了一些帖子和资料,但是讲的清楚明白的感觉比较少,这里讲一下如何最简单地实现游戏中人物技能和buff的实现。
实现思路
在游戏中Buff的作用是使人物产生被动的效果影响。比如提升人物的属性、增加人物判定成功的概率、在动作执行时附加额外动作等。
实现的思路如下:
- 编写ScriptableObject的子类BuffData,以创建保存Buff的id、图标、介绍等信息的asset文件;
- 创建可持有BuffData对象的父类IBuff,其子类的对象将作为玩家在游戏进行中持有的Buff;
- 在IBuff类中设置三个函数BuffStart、BuffEnd、BuffEffect,分别用于Buff添加、Buff消除、Buff触发。
- 制作管理类BuffManager,声明添加Buff、消除Buff、层数叠加等管理方法。
使用委托实现buff触发
对于设计完备的游戏而言,在某一动作下可能触发的Buff数量可能是非常庞大的。如果给每一种buff都设置一个bool变量,每一次操作都对所有的变量进行判断,无论是代码的冗余量还是程序的运行效率都是非常糟糕的。
因此,可以使用C#中的委托来实现Buff功能的动态添加与消除:
- 在BuffManager类中声明buff触发的委托buffCall;
- 当Buff被添加时,将IBuff类中的Buff触发函数BuffEffect添加至设置好的委托buffCall中;
- 在需要触发的动作的方法中调用buffCall。
具体的Unity委托用法可以参考我的这篇博文 C#的委托类(2分钟了解委托用法)
整个系统的结构如图:
代码编写
BuffData类:
/// <summary>
/// 保存Buff的各项数据,如最高等级、持续时间、效果值等
/// </summary>
[CreateAssetMenu(menuName = "BuffData", fileName = "buff")]
public class BuffData : ScriptableObject
{
public int id;
public string buffName;
public int maxLevel;
public float[] buffValue = new float[10];
public float[] lastTime = new float[10];
public float restTime;
public Sprite buffIcon;
[TextArea(2, 3)]
public