在本教程中,我将向您展示如何使用可脚本化对象为Unity创建灵活的buff系统。我们将使用可编写脚本的对象作为快速创建和管理buff的方法,而不必使用外部数据类型(如xml或txt文件)。这可以让我们将buff数据从游戏逻辑中分离出来,例如持续时间和统计数据。正如您将看到的那样,这也将允许我们使用CreateAssetMenu属性将我们的可脚本化对象绑定为资产。
我们设计的前提将围绕三个类。玩家类,buff类和buff脚本对象。玩家类作为我们的通用玩家模型,它可以同时具有多个buff,以及相同类型(堆叠)的多个buff。 buff脚本对象充当我们的数据,buff类是我们之间的桥梁,处理每个buff的逻辑。

首先,我们将创建一个我们的buff脚本对象。每个buff应该有一个持续时间,我们需要一种从我们的数据创建这个buff的方法。

ScriptableBuff.cs

public abstract class ScriptableBuff : ScriptableObject

{

public float Duration

public abstract TimedBuff InitializeBuff(GameObject obj)

}

到目前为止,我们的ScriptableBuff只包含一个持续时间的字段和一个返回TimedBuff对象的抽象方法。 TimedBuff是我们需要链接数据和播放模型的桥梁。

TimedBuff.cz

public abstract class TimedBuff

{

protected float duration;

protected ScriptableBuff buff;

protected GameObject obj;

public Boolean IsFinished

{

get { return duration <= 0? true: false; }

}

public TimedBuff(float duration, ScriptableBuff buff, GameObject obj)

{

this.duration = duration;

this.buff = buff;

this.obj = obj;

}


    public void Tick(float delta)
    {
        duration -= delta;
        if(duration <= 0)
            End();
    }
 
    public abstract void Activate();
    public abstract void End();
}
我们假设所有的buff都有一个持续时间,但是你可以很容易地改变。 我们希望所有TimedBuff对象存储引用持续时间,buff数据和接收buff的游戏对象。 还有以下方法:
void Tick(float delta) – 在buff的更新循环中调用它。 这用于在剩余的持续时间内保持定时器,完成后调用End()。
void Activate() – 在初始化后调用此函数来激活buff logic.void End()- 持续时间结束时调用。 也可以提早调用“end”buff。
现在我们只需要玩家类。 为此,我们将创建一个名为BuffableEntity的MonoBehaviour组件。
BuffableEntity.cs
 
public class BuffableEntity: MonoBehaviour
{
 
    public List<TimedBuff> CurrentBuffs = new List<TimedBuff>();
 
    void Update()
    {
        //if (Game.isPaused)
        //    return;
 
        foreach(TimedBuff buff in CurrentBuffs.ToArray())
        {
            buff.Tick(Time.deltaTime);
            if (buff.IsFinished)
            {
                CurrentBuffs.Remove(buff);
            }
        }   
    }
 
    public void AddBuff(TimedBuff buff)
    {
        CurrentBuffs.Add(buff);
        buff.Activate();
    }
}
BuffableEntity保存所有当前的buff的列表。 在每个更新循环期间,它会选中每个buff,并删除已经完成的buff。 通过从最后一帧提供deltaTime,这样可以更好地控制更新buff的时间。 例如,您可能希望冻结游戏暂停或玩家被淘汰时的持续时间。
那么我们如何使用这个buff系统呢?
SpeedBuff.cs
[CreateAssetMenu(menuName = "Buffs/SpeedBuff")]
public class SpeedBuff: ScriptableBuff
{
    public float SpeedIncrease;
    public override TimedBuff InitializeBuff(GameObject obj)
    {
       return new TimedSpeedBuff(Duration, this, obj);
    }
}
这扩展了我们的ScriptableBuff来保存SpeedIncrease上的数据。 另外,通过调用InitializeBuff,我们可以创建一个TimedSpeedBuff,我们将在下面实现。 我们还使用CreateAssetMenu属性来将此脚本化对象创建为asset。
TimedSpeedBuff.cs
public class TimedSpeedBuff : TimedBuff
{
    private SpeedBuff speedBuff;
    private MovementComponent movementComponent;
    public TimedSpeedBuff(float duration, ScriptableBuff buff, GameObject obj) : base(duration, buff, obj)
    {
        movementComponent = obj.GetComponent<MovementComponent>();
        speedBuff = (SpeedBuff)buff;
    }
    public override void Activate()
    {
        SpeedBuff speedBuff = (SpeedBuff) buff;
        movementComponent.moveSpeed += speedBuff.SpeedIncrease;
    }
 
    public override void End()
    {
        movementComponent.moveSpeed -= speedBuff.SpeedIncrease;
    }
}
这只是一个简单的buff,但是您可以看到,在Activate()函数中,MovementComponent的速度增加,然后在End()函数中,更改被还原。 这就是实现你的buff所需要的。更多unity相关的内容,就在 纳金网上。

简单的技能Buff系统相关推荐

  1. buff系统 游戏中_如何实现一个强大的MMO技能系统——BUFF

    前言 Buff模块可以说是技能中最核心又最复杂的系统了.一个优秀的Buff系统能够让策划的创意得到最大限度的发挥,大幅增强游戏的战斗深度和可玩性,并且同时也能让开发者轻易的扩展维护,支持更多的效果和功 ...

  2. Unity3D 实现简单的Buff系统

    今天来考虑一下,想要实现一个buff系统需要什么功能. 能力不行,写的不好,请大家指正完善,谢谢~~ 在我们接到一个需求的时候,往往需要先分析一下需求,确定我们要实现什么样的功能,大部分的情况下需求功 ...

  3. 游戏中的技能如何而来? 为ARPG设计一个好用的BUFF系统

    转自:游戏中的技能如何而来? 为ARPG设计一个好用的BUFF系统 - GameRes游资网 游戏中有宏大的场景地图,丰富的游戏剧情,逼真的人物角色.但要让角色(职业)炫酷起来,还是要靠各个职业的技能 ...

  4. Unity--简单Buff系统

    2017年2月25日,广州前2天开始降温,久违的感受到寒冷的天气了.也在这个时候,确定了新的工作,希望以后能有更好的发展,对得起家人和朋友和恋人.在这里也感谢一下上家公司带我的组长,学到了很多东西,希 ...

  5. 浅谈魔兽世界的BUFF系统和阵营系统

    游戏中的行为所产生的效果在设计上是一种看似简单,但是难以做的很抽象并且有很强的扩展性的系统.但魔兽世界创立了BUFF系统来统一这个设计概念. 这一概念可以很简单的把一些系统连接起来,例如:通道魔法,只 ...

  6. Unity教程之-Unity游戏技能Skill系统架构设计

    我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10 ...

  7. 网络游戏战斗系统之buff系统具体设计实现

    在网络游戏中的战斗形式多种多样,不同游戏的战斗逻辑也有很大的差异.但是一般都会涉及技能系统和buff系统,两种之间相互关联,技能可以产生buff作用在目标上,影响目标.同时buff也会影响技能的释放效 ...

  8. Buff系统框架设计

    Buff的配置文件 BufType: 1: 精神类Buf 2: 物理类Buf 3.元素类Buf 4.其他类Buf 5.被动类Buf BufSubType: 1000-1999 精神子类 2000-29 ...

  9. 用RC522与arduino做一个简单的门禁系统

    用RC522与arduino做一个简单的门禁系统 插本成功要去新学校了,结果发现新学校宿舍没有电梯没有电子门(虽然海景房很香).这对于住惯养老院的我属实难受所所以打算自己也整一个IC卡的门禁系统.然后 ...

最新文章

  1. SVN账号重新指定方法
  2. ABAP 在字符串之间加入若干空格
  3. boost::log::filter用法的测试程序
  4. 使用Math 类 和 Random类 两种方式生成 20 到30之间的随机整数---java基础
  5. 事务复制提示初始快照不可用_「MySQL」数据库事务深入分析
  6. dns服务器的配置与管理
  7. linux从usb安装软件,Linux下USB Camera的安装和使用
  8. 谈谈应届生应聘的一点看法
  9. 应用程式中夜间模式的Android DayNight主题
  10. C++程序设计必知:多文件结构和编译预处理命令
  11. 信息论的基本概念和熵的计算
  12. Windows下SVNServer安装和配置
  13. 用户登录项目第二期——HTML登录页面实现
  14. 计算机培训excel的制作,绵阳电脑excel表格制作教程
  15. C++ 实现程序暂停
  16. 网站建设多少钱(做一个网站需要多少钱)
  17. 漫反射与高光反射总结
  18. 在Ubuntu上安装和使用miniconda
  19. Latex文本两端对齐
  20. Nginx-第一天--HTTP

热门文章

  1. 【游戏开发Unity】捏脸系统(附源码)
  2. 灭霸打了一个响指,我就学会了C语言的「分支与循环语句」
  3. 一文了解Java隐式类型转换
  4. 艾司博讯:拼多多诱导非官方交易怎么处理?
  5. windows10上安装mysql(详细步骤)
  6. 加菲猫台词 (请对号入座-:))
  7. 我要寄件 网上寄件
  8. DSP CCS12.00 芯片:TMS320F28335 结课设计 频率测量系统设计
  9. Linux 容器化技术详解(虚拟化、容器化、Docker)
  10. win7桌面上显示html,win7桌面图标不见了怎么办,显示Windows 7桌面图标的方法