MDDSkillEngine是基于GameFramework编写的
所以了解GF框架的小伙伴可以非常快速的上手
SkillSystem的作用是将技能需要的各种数据与逻辑统筹管理起来
让我们能够以简单明快的api调用装配或者卸载技能,实际代码如下:
ISkillSystem skillSystem = Game.Skill.GetSkillSystem(Id);
skillSystem.AddSkill(10010);
skillSystem.UseSkill(10010);
skillSystem.RemoveSkill(10010);
简单概述前置代码结构准备
技能的最小承载单位为Entity
这里的Entity和GF中Entity模块中的Entity概念一致
完备的技能系统初始化步骤
MDDSkillEngine中技能runtime的逻辑承载系统有4个
NPBehave
SkillSystem
BuffSystem
FSM
其中对NPBehave的调用封装在了SkillSystem中
所以我们只需要写如下代码就可以以组件为单位依次初始化各个系统
protected override void OnShow(object userData)
{
base.OnShow(userData);
Name = "Hero103";
//组件初始化
Game.Buff.CreatBuffSystem(this.Entity.Id.ToString(), this);
Game.Fsm.CreateFsm(this);
Game.Skill.CreateSkillSystem(this);
}
回收系统也是如此
protected override void OnHide(bool isShutdown, object userData)
{
base.OnHide(isShutdown, userData);
Game.Buff.RemoveBuffSystem(Id.ToString());
Game.Fsm.DestroyFsm(Id.ToString());
Game.Skill.RemoveSkillSystem(Id);
}
制作剑刃风暴
1.用行为树构建释前逻辑
(1)找到技能行为树对应目录

(2)复制粘贴一份技能行为树文件或者自行创建一份并为其命名

(3)为技能行为树指定公共黑板

其中公共黑板存在目录如下:

公共黑板一般用来存放如角色技能公共CD之类的以技能系统为单位的数据
(4)编辑行为树
按Q保存数据!!!!!!!

其中辅助菜单中可以编辑技能黑板和技能系统黑板技能系统黑板为多技能公用黑板

一般我们会将技能是否被请求释放 抽象成一个input黑板字段
在辅助菜单中我们也可以查看我们现在可以使用的节点

按住鼠标拖动其到面板上即可创建一个新的节点
如何添加新的自定义节点在这里不做详细叙述
2.构建一个SkillTimeline数据
目录如下:

(1)创建时复制粘贴一份技能数据并重新命名即可
(2)编辑SkillTimeline
从菜单中进入已经准备好的编辑场景:

选择需要编辑的SkillTimeline数据

进行timeline的编辑


介绍一下对碰撞体的处理


在ColliderClip中你可以指定碰撞体的预制,逻辑,以及触发回调buff
可以指定碰撞体的初始化坐标
同时还可以为其指定一个专属的曲线位移数据并编辑曲线位移路径
编辑完成后
请保存

(3)进行技能数据导出
因为我们并不会使用slate的运行时
所以我们需要对编辑好的数据进行导出操作
数据导出选项如下

导出完成后会在如下目录生成runtime需要二进制文件
也是需要打进游戏包体的文件

3.创建一份与SkillTimline同名的技能状态胶水代码并做简单的修改
胶水代码目录如下

在此目录下随意找一份有着【skill】标签的state.cs
复制粘贴并修改命名即可
胶水代码统一格式如下
using MDDGameFramework;
using MDDGameFramework.Runtime;
namespace MDDSkillEngine
{
[Skill]
public class huanyinjianwuState : SkillTimelineState
{
protected override void OnInit(IFsm fsm)
{
base.OnInit(fsm);
}
protected override void OnEnter(IFsm fsm)
{
base.OnEnter(fsm);
Log.Info("{0}进入{1}状态", LogConst.FSM, GetType().Name);
}
protected override void OnDestroy(IFsm fsm)
{
base.OnDestroy(fsm);
}
protected override void OnLeave(IFsm fsm, bool isShutdown)
{
base.OnLeave(fsm, isShutdown);
Log.Info("{0}离开{1}状态", LogConst.FSM, GetType().Name);
}
protected override void OnUpdate(IFsm fsm, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(fsm, elapseSeconds, realElapseSeconds);
}
///
/// 状态跳转
/// 基于黑板的观察函数
///
///
///
protected override void Observing(Blackboard.Type type, Variable newValue)
{
VarBoolean varBoolean = (VarBoolean)newValue;
if (varBoolean.Value == false)
return;
//如此写表示idle状态可以释放技能
//如有额外需求请在此自定义写法
if (((MDDFsmState)Fsm.CurrentState).StateType == StateType.IDLE)
{
ISkillSystem skillSystem = Game.Skill.GetSkillSystem(Fsm.Owner.Id);
skillSystem.SetSkillReleaseResultType(SkillReleaseResultType.PROGRESS);
ChangeState(Fsm,GetType());
}
else
{
ISkillSystem skillSystem = Game.Skill.GetSkillSystem(Fsm.Owner.Id);
skillSystem.SetSkillReleaseResultType(SkillReleaseResultType.FAIL);
}
}
}
}
4.技能制作完成,适配表格,并在技能征召模式中查看技能效果
在技能表中添加一行
技能表主要用来辅助技能资源的索引
填0代表写不写无所谓

选择启动场景进入征召模式技能就会出现在技能库中



选中你想要操作的角色将技能拖至技能栏并释放查看效果


本人使用MDDSkillEngine体验
我制作这个技能框架的过程中
越到后期越意识到
当技能种类越来越多
可复用的节点模块越来越多
制作一个技能将会不需要程序写哪怕一行代码
在制作幻影剑舞的示例中有美术资源的前提下,除了胶水代码(当然也可以做一个自动生成代码的配置),其他全可以靠策划配置实现
而最终决定一个技能品质的,是美术,是策划的设计与使用SkillEngine的实际劳动力投入,同时背后站着一个稳定全面的技能编辑器

