前言
尝试写一个技能系统,希望其尽量完善。目前能想到的元素包括控制、模型、动画、音效、特效、碰撞检测、事件响应、伤害判断、Buff控制。集所有元素为一个编辑器,方便策划和美术进行操作。
输入控制
使用Input System
作为跨平台接收输入响应,然后整合到Character
脚本中,然后由Character
的OnCharacterEvent
事件节点,监听对应的操作。
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
进行连击即可触发,下面多连击动作的展示。
连击A
连击AA
连击AAA
基础动画
除了技能动画以外, 还有一些Idle
、Walk
、Jump
等常规动画。本来想沿用技能实现使用Timeline
一套的解决方案,但是总感觉有点不搭。这里还是使用了默认的Animator
让几个基础动画的切换感觉更合理一些。
输入在Input System
中添加movement
的Input Action
使用Vector2
作为返回值, 键盘WASD
、xbox的摇杆、以及移动端的虚拟摇杆都可以映射为一个Vector2
的值,方便进行角色的控制。
基础动画的展示
碰撞检测
这里我主要在角色的大刀上绑定了一个碰撞盒子,并结合Timeline
在技能施放动画的一定区间范围内开启碰撞盒子,方便让攻击的碰撞更为合理。并且在编辑器里面添加了一个创建测试的敌人的快捷按钮Create Enemy
在检测的碰撞的同时,可以获取当前角色正在施放的技能信息。即可对敌人进行,伤害判定,播放受击动画,以及添加BUFF或者DEBUFF。
因为连击技能也是一个个单独的技能,每个连击动作都有自己的单独属性,都可以根据不同的连击动画,给敌人造成更高的伤害。
敌人受击展示
BUFF系统
Buff
主要是一个以计时器驱动的角色属性持续修改的状态。它本身包括的东西很多,除了就能修改角色自带的那一部分属性,还可以对角色进行一些其他操作,比如无敌
、击飞
、击退
、沉默
、恐惧
、嘲讽
、禁锢
等等。
因为Buff
的重复使用率非常高,这里会建立一个Buff
池,在角色收到一个技能攻击的时候,会从Buff Pool
中取出一个Buff
并对其进行初始化,然后遍历当前角色的所有Buff
,并根据Buff
的基本信息,确定其中的优先级,然后执行对应的逻辑。在计时结束的时候,会回收给Buff
池。
在Buff
持续存在的时间段中,角色的实时属性,有基础属性+Buff
的各种因子综合而来。
未完待续
根据具体的需求,一个技能系统的复杂程度远不止于此。当前很多东西,还没设计完善,都还是针对点的说明,后续持续修改更新。
这篇博客在这里也算抛砖引玉了。
如果觉得《Unity实现动作游戏的技能系统(Ability System)设计原型》对你有帮助,请点赞、收藏,并留下你的观点哦!