Unity实现动作游戏的技能系统(Ability System)设计原型

前言

尝试写一个技能系统,希望其尽量完善。目前能想到的元素包括控制、模型、动画、音效、特效、碰撞检测、事件响应、伤害判断、Buff控制。集所有元素为一个编辑器,方便策划和美术进行操作。

输入控制

使用Input System作为跨平台接收输入响应,然后整合到Character脚本中,然后由CharacterOnCharacterEvent事件节点,监听对应的操作。
在这里插入图片描述

public void AddActionStarted(string actionName,Action<InputAction.CallbackContext> callback)
{
    
    
   GetInputAction(actionName).started += callback;
}
public void AddActionPerformed(string actionName, Action<InputAction.CallbackContext> callback)
{
    
    
   GetInputAction(actionName).performed += callback;
}
public void AddActionCanceled(string actionName, Action<InputAction.CallbackContext> callback)
{
    
    
   GetInputAction(actionName).canceled += callback;
}


private InputAction GetInputAction(string actionName)
{
    
    
   var action = _inputCharacterGamePlay.FindAction(actionName, throwIfNotFound: true);
   return action;
}

技能编辑

使用Timeline作为一个整合工具,可以添加动画特效音效物体控制扩展脚本集成为一个技能,并可以在Scene中随时进行预览。具体操作可以参考官方教程。
在这里插入图片描述
扩展了一个PlayableAsset作为Combo触发条件,为连击动画的衔接尽量合理而规定了一定的触发范围。

角色编辑器

在编辑了多个技能后,肯定需要一个角色编辑器来统筹所有的技能。规范技能播放的规则,进行碰撞检测等一系列操作,打通角色的操作的逻辑。
这里的Character是通过继承ScriptableObject实现的,方便保存角色的系列信息,并扩展了一个CharacterEditor,用来编辑保存角色的一些属性、技能、以及控制逻辑。
在这里插入图片描述

技能触发

在角色编辑器中创建OnCharacterEvent节点,然后创建一个Skill节点,连接即可触发技能播放。事件支持Input System触发,直接输入Input Action的名称,就可以获取当前的输入返回的参数。
在这里插入图片描述

若当前技能需要技能效果,则利用Timeline创建多个技能,通过OnCombo进行连击即可触发,下面多连击动作的展示。
在这里插入图片描述

  1. 连击A
    在这里插入图片描述
  2. 连击AA
    在这里插入图片描述
  3. 连击AAA
    在这里插入图片描述

基础动画

除了技能动画以外, 还有一些IdleWalkJump等常规动画。本来想沿用技能实现使用Timeline一套的解决方案,但是总感觉有点不搭。这里还是使用了默认的Animator让几个基础动画的切换感觉更合理一些。
在这里插入图片描述
输入在Input System中添加movementInput Action使用Vector2作为返回值, 键盘WASD、xbox的摇杆、以及移动端的虚拟摇杆都可以映射为一个Vector2的值,方便进行角色的控制。
在这里插入图片描述
基础动画的展示
在这里插入图片描述

碰撞检测

这里我主要在角色的大刀上绑定了一个碰撞盒子,并结合Timeline在技能施放动画的一定区间范围内开启碰撞盒子,方便让攻击的碰撞更为合理。并且在编辑器里面添加了一个创建测试的敌人的快捷按钮Create Enemy
在这里插入图片描述
在检测的碰撞的同时,可以获取当前角色正在施放的技能信息。即可对敌人进行,伤害判定,播放受击动画,以及添加BUFF或者DEBUFF。
因为连击技能也是一个个单独的技能,每个连击动作都有自己的单独属性,都可以根据不同的连击动画,给敌人造成更高的伤害。
在这里插入图片描述
敌人受击展示
在这里插入图片描述

BUFF系统

Buff主要是一个以计时器驱动的角色属性持续修改的状态。它本身包括的东西很多,除了就能修改角色自带的那一部分属性,还可以对角色进行一些其他操作,比如无敌击飞击退沉默恐惧嘲讽禁锢等等。
在这里插入图片描述
因为Buff的重复使用率非常高,这里会建立一个Buff池,在角色收到一个技能攻击的时候,会从Buff Pool中取出一个Buff并对其进行初始化,然后遍历当前角色的所有Buff,并根据Buff的基本信息,确定其中的优先级,然后执行对应的逻辑。在计时结束的时候,会回收给Buff池。
Buff持续存在的时间段中,角色的实时属性,有基础属性+Buff的各种因子综合而来。

未完待续

根据具体的需求,一个技能系统的复杂程度远不止于此。当前很多东西,还没设计完善,都还是针对点的说明,后续持续修改更新。
这篇博客在这里也算抛砖引玉了。

猜你喜欢

转载自blog.csdn.net/qq992817263/article/details/117661371