Unity中的人物buff状态的实现

最近在考虑怎么写游戏中人物的技能与buff状态,在一些论坛里搜索了一些帖子和资料,但是讲的清楚明白的感觉比较少,这里讲一下如何最简单地实现游戏中人物技能和buff的实现。

实现思路

在游戏中Buff的作用是使人物产生被动的效果影响。比如提升人物的属性、增加人物判定成功的概率、在动作执行时附加额外动作等。

实现的思路如下:

  1. 编写ScriptableObject的子类BuffData,以创建保存Buff的id、图标、介绍等信息的asset文件;
  2. 创建可持有BuffData对象的父类IBuff,其子类的对象将作为玩家在游戏进行中持有的Buff;
  3. 在IBuff类中设置三个函数BuffStart、BuffEnd、BuffEffect,分别用于Buff添加、Buff消除、Buff触发。
  4. 制作管理类BuffManager,声明添加Buff、消除Buff、层数叠加等管理方法。

使用委托实现buff触发

对于设计完备的游戏而言,在某一动作下可能触发的Buff数量可能是非常庞大的。如果给每一种buff都设置一个bool变量,每一次操作都对所有的变量进行判断,无论是代码的冗余量还是程序的运行效率都是非常糟糕的。

因此,可以使用C#中的委托来实现Buff功能的动态添加与消除:

  1. 在BuffManager类中声明buff触发的委托buffCall;
  2. 当Buff被添加时,将IBuff类中的Buff触发函数BuffEffect添加至设置好的委托buffCall中;
  3. 在需要触发的动作的方法中调用buffCall。

具体的Unity委托用法可以参考我的这篇博文 C#的委托类(2分钟了解委托用法)

整个系统的结构如图:

Unity中的人物buff状态的实现_第1张图片

代码编写

BuffData类:

/// 
///	保存Buff的各项数据,如最高等级、持续时间、效果值等
/// 
[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)

你可能感兴趣的:(游戏编程基础,Unity2D开发日志,游戏,Unity,游戏,开发,实战,pdf,visual,studio)