看 Udemy 的课程记录下笔记…
# 角色连击
主要分为三个阶段
1. 动画开始要去加载动画特效 2. 动画结束,需要动画切回初始状态,并且回复之前所有的参数 3. 当动画播放到一定进度时,接收用户切换动画的请求
# 动画连击的本质
一个动画 [0-XX%] 时不允许切换,当过了这个给定的百分比,则允许用户切换动画 (通过指定事件)
# 动画间切换逻辑
如上图,主要分为四个阶段,接下来会逐一介绍这四个阶段分别代表什么
-
CastSkillBegin:
这个阶段主要是从 Idle 这个动画到 Attack 这个动画的融合开始,也即 Attack 这个动画的开始,这个阶段主要是准备 Attack 的特效 -
CastSkillEnd1:
这个阶段主要是 Idle 动画的结束,完全进入 Attack 动画,完全进入 Attack 动画后主要的逻辑是准备好 Attack 的参数 -
CastSkillReady:
这个阶段即第一部分介绍的连击动画本质那里的阈值点,即 Attack 动画大于这个百分比时候回触发一个 CastSkillReady 的回调,这个回调会监听是否触发下一个连击动画 (如果有的话)
至于这个阈值如何选定,那是需要具体根据动画的攻击效果来确定的 -
CastSkillEnd:
这个节点是整个 Attack 结束的那一刻,但真正的结束是在这个一刻的下一帧,即完全进入 Idle 状态
# 简要架构
其中 AnimCtrl 主要负责输入的部分,比如获取用户的键盘输入 StateMachine 是专用于动画控制器的 StateMachineBehaviour, 可以从中获取到第二部分介绍的各个时期的状态,即当前动画状态机的状态 AnimatorManager 主要负责整个动画逻辑的控制
# CastSkillEnd
其中,CastSkillEnd 的判断应该依据两点
- 当前帧是由上一个动画的融合结束而来的.
- 当前帧没有在融合
所以代码如下:
1 | if (!IsCurTransition) |
其中 (IsCurTransition) 是代表当前是否在融合,这个直接调用 Animator 的
1 | animator.IsInTransition(layerIndex); |
layerIndex 是状态机的层
# CastSkillBegin
Attack 动画开始的时候执行这个,即 - 上一帧没在融合,当前帧在融合
1 | if(IsCurTransition && !IsLastTransition)//当前在融合,且上一帧没在融合 |
# CastSkillEnd1
即 Idle 状态结束,当前状态开始
1 | if(!IsCurTransition && IsLastTransition) |
# 回调函数 TrigAction
TrigAction 接受当前处在的状态的枚举,当前的 StateMachine 记录每个状态下的回调
# AnimatorManager
AnimatorManager 负责处理 Animation 的 StartAnimation 每次 StartAnimation 后清空所有的回调