简单的技能Buff系统
在本教程中,我将向您展示如何使用可脚本化对象为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系统相关推荐
- buff系统 游戏中_如何实现一个强大的MMO技能系统——BUFF
前言 Buff模块可以说是技能中最核心又最复杂的系统了.一个优秀的Buff系统能够让策划的创意得到最大限度的发挥,大幅增强游戏的战斗深度和可玩性,并且同时也能让开发者轻易的扩展维护,支持更多的效果和功 ...
- Unity3D 实现简单的Buff系统
今天来考虑一下,想要实现一个buff系统需要什么功能. 能力不行,写的不好,请大家指正完善,谢谢~~ 在我们接到一个需求的时候,往往需要先分析一下需求,确定我们要实现什么样的功能,大部分的情况下需求功 ...
- 游戏中的技能如何而来? 为ARPG设计一个好用的BUFF系统
转自:游戏中的技能如何而来? 为ARPG设计一个好用的BUFF系统 - GameRes游资网 游戏中有宏大的场景地图,丰富的游戏剧情,逼真的人物角色.但要让角色(职业)炫酷起来,还是要靠各个职业的技能 ...
- Unity--简单Buff系统
2017年2月25日,广州前2天开始降温,久违的感受到寒冷的天气了.也在这个时候,确定了新的工作,希望以后能有更好的发展,对得起家人和朋友和恋人.在这里也感谢一下上家公司带我的组长,学到了很多东西,希 ...
- 浅谈魔兽世界的BUFF系统和阵营系统
游戏中的行为所产生的效果在设计上是一种看似简单,但是难以做的很抽象并且有很强的扩展性的系统.但魔兽世界创立了BUFF系统来统一这个设计概念. 这一概念可以很简单的把一些系统连接起来,例如:通道魔法,只 ...
- Unity教程之-Unity游戏技能Skill系统架构设计
我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10 ...
- 网络游戏战斗系统之buff系统具体设计实现
在网络游戏中的战斗形式多种多样,不同游戏的战斗逻辑也有很大的差异.但是一般都会涉及技能系统和buff系统,两种之间相互关联,技能可以产生buff作用在目标上,影响目标.同时buff也会影响技能的释放效 ...
- Buff系统框架设计
Buff的配置文件 BufType: 1: 精神类Buf 2: 物理类Buf 3.元素类Buf 4.其他类Buf 5.被动类Buf BufSubType: 1000-1999 精神子类 2000-29 ...
- 用RC522与arduino做一个简单的门禁系统
用RC522与arduino做一个简单的门禁系统 插本成功要去新学校了,结果发现新学校宿舍没有电梯没有电子门(虽然海景房很香).这对于住惯养老院的我属实难受所所以打算自己也整一个IC卡的门禁系统.然后 ...
最新文章
- SVN账号重新指定方法
- ABAP 在字符串之间加入若干空格
- boost::log::filter用法的测试程序
- 使用Math 类 和 Random类 两种方式生成 20 到30之间的随机整数---java基础
- 事务复制提示初始快照不可用_「MySQL」数据库事务深入分析
- dns服务器的配置与管理
- linux从usb安装软件,Linux下USB Camera的安装和使用
- 谈谈应届生应聘的一点看法
- 应用程式中夜间模式的Android DayNight主题
- C++程序设计必知:多文件结构和编译预处理命令
- 信息论的基本概念和熵的计算
- Windows下SVNServer安装和配置
- 用户登录项目第二期——HTML登录页面实现
- 计算机培训excel的制作,绵阳电脑excel表格制作教程
- C++ 实现程序暂停
- 网站建设多少钱(做一个网站需要多少钱)
- 漫反射与高光反射总结
- 在Ubuntu上安装和使用miniconda
- Latex文本两端对齐
- Nginx-第一天--HTTP