该项目是一个通用的Buff系统,旨在帮助Unity开发者轻松实现游戏中的Buff效果。该系统能够轻松集成到现有项目,你可以方便地添加、管理和应用自定义逻辑的Buff。
该项目是一个通用的Buff系统,旨在帮助Unity开发者轻松实现游戏中的Buff效果。该系统能够轻松集成到现有项目,你可以方便地添加、管理和应用自定义逻辑的Buff。
将Assets/NoSLoofah_BuffSystem/BuffSystem文件夹拷贝到你的项目
或导入Release中的unitypackage
在Unity编辑器的工具栏打开Tools/BuffEditor 点击后打开Buff编辑器窗口,同时生成文件夹BuffSystem/Data/BuffData。BuffData文件夹保存了你配置的Buff数据,请不要修改其中资产的文件名,也不要改动他们的路径。
创建任意名称的新Buff脚本,引用命名空间NoSLoofah.BuffSystem,让该类继承Buff。实现抽象类后的格式如下:
using UnityEngine;
using NoSLoofah.BuffSystem;
public class Buff_XXX : Buff
{
public override void OnBuffAwake()
{
base.OnBuffAwake();
}
public override void OnBuffDestroy(){}
public override void OnBuffModifyLayer(int change){}
public override void OnBuffRemove(){}
public override void OnBuffStart(){}
public override void Reset(){}
protected override void OnBuffTickEffect(){}
}
请在对应的函数里实现需要的功能。 Buff的生命周期如下:
注意:Buff执行的第一个Update会通过OnBuffModifyLayer将自己的层数从0提升为1,而OnBuffDestroy会将层数重置为0并F最后执行一次OnBuffModifyLayer
一个简单的中毒Buff可以这样实现:
using UnityEngine;
using NoSLoofah.BuffSystem;
public class Buff_Poison : Buff
{
[SerializeField] private int poisonDamage;
[SerializeField] private float poisonTimeInterval;
[SerializeField] private GameObject effect;
private Entity1 targetEntity;
public override void OnBuffDestroy() { base.OnBuffDestroy(); }
public override void OnBuffModifyLayer(int change) { }
public override void OnBuffRemove() { }
public override void OnBuffStart()
{
targetEntity = Target.GetComponent<Entity1>();
StartBuffTickEffect(poisonTimeInterval);
}
public override void Reset() { }
protected override void OnBuffTickEffect()
{
targetEntity.ModifyHealth(-Layer * poisonDamage);
var g = Instantiate(effect);
g.transform.position = Target.transform.position;
}
}
Entity1可以换成你自己的业务类
打开BuffEditor,可以看到编辑器分为两栏: 左栏显示项目中你配置好的所有Buff。每一项的冒号左侧是这个Buff的序号,右侧是Buff的名称。如果Buff没有命名,则会显示为NULL,且系统会将其视为空Buff。配置的Buff是可以重名的,但是名称不能为空。
也许你会好奇如果给Buff起名为NULL会怎么样—— 实际上不会出现任何Bug,只会让你自己看着犯迷糊
左下角可以修改最大Buff数量。如果你将数字改小,那么序号排最后的Buff数据都会被删除
现在选中一个空Buff,右栏显示如下: 出现了一个名为类的下拉框,其内容是Buff的所有子类。我们在上一步添加的Buff_Poison也自动显示在了上面(图上另外的两个Buff来自项目的示例文件) 选中Buff_Poison,我们配置一个新的中毒Buff 图中白框框住的是Buff类的成员,红框框住的是我们为Buff_Poison添加的独有的成员。下面介绍可以在Buff子类中访问到的成员:
点击BuffSystem/Data/BuffData路径下的BuffTagData.asset,观察Inspector 目前Tag的数量是固定的,为31个。我们在上一节配置Buff时看到,每个Buff都可以配置一个Tag。我们在BuffTagData.asset配置Tag之间的互斥关系
如果你需要修改Tag的名称,请在BuffSystem/Base/Tag/BuffTag.cs修改
public interface IBuffHandler
{
/// <summary>
/// 添加Buff
/// </summary>
/// <param name="buffId">施加Buff的ID</param>
/// <param name="caster">施加Buff者</param>
public void AddBuff(int buffId, GameObject caster);
/// <summary>
/// 移除Buff
/// </summary>
/// <param name="buffId">要移除的Buff id</param>
/// <param name="removeAll">如果对象同时存在多个同id的buff,是否将所有一并移除</param>
public void RemoveBuff(int buffId, bool removeAll = true);
/// <summary>
/// 移除Buff(不执行OnBuffDestroy)
/// </summary>
/// <param name="buffId">要移除的Buff id</param>
/// <param name="removeAll">如果对象同时存在多个同id的buff,是否将所有一并移除</param>
public void InteruptBuff(int buffId, bool interuptAll = true);
/// <summary>
/// 注册事件:添加Buff时
/// </summary>
/// <param name="act"></param>
public void RegisterOnAddBuff(Action act);
/// <summary>
/// 删除事件:添加Buff时
/// </summary>
/// <param name="act"></param>
public void RemoveOnAddBuff(Action act);
/// <summary>
/// 注册事件:删除Buff时
/// </summary>
/// <param name="act"></param>
public void RegisterOnRemoveBuff(Action act);
/// <summary>
/// 删除事件:删除Buff时
/// </summary>
/// <param name="act"></param>
public void RemoveOnRemoveBuff(Action act);
}
例如,示例项目中通过按钮添加、移除、打断Buff是这样实现的: