Unity实现动作游戏的技能系统(Ability System)设计原型
Posted 神码编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity实现动作游戏的技能系统(Ability System)设计原型相关的知识,希望对你有一定的参考价值。
前言
尝试写一个技能系统,希望其尽量完善。目前能想到的元素包括控制、模型、动画、音效、特效、碰撞检测、事件响应、伤害判断、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)设计原型的主要内容,如果未能解决你的问题,请参考以下文章