看 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. 当前帧是由上一个动画的融合结束而来的.
  2. 当前帧没有在融合

所以代码如下:

1
2
3
4
5
6
7
8
if (!IsCurTransition)
{
if(stateInfo.normalizedTime % 1.0 <LastStateInfo.normalizedTime % 1.0f)
{
//CastSkillEnd
TrigAction(eTrigSkillState.eTrigEnd);
}
}

其中 (IsCurTransition) 是代表当前是否在融合,这个直接调用 Animator 的

1
animator.IsInTransition(layerIndex);

layerIndex 是状态机的层

# CastSkillBegin

Attack 动画开始的时候执行这个,即 - 上一帧没在融合,当前帧在融合

1
2
3
4
5
if(IsCurTransition && !IsLastTransition)//当前在融合,且上一帧没在融合
{
//CastSkillBegin
TrigAction(eTrigSkillState.eTrigBegin);
}

# CastSkillEnd1

即 Idle 状态结束,当前状态开始

1
2
3
4
5
if(!IsCurTransition && IsLastTransition)
{
//CastSkillEnd1
TrigAction(eTrigSkillState.eTrigEnd);
}

# 回调函数 TrigAction

TrigAction 接受当前处在的状态的枚举,当前的 StateMachine 记录每个状态下的回调

# AnimatorManager

AnimatorManager 负责处理 Animation 的 StartAnimation 每次 StartAnimation 后清空所有的回调

更新于

请我喝[茶]~( ̄▽ ̄)~*

Solvarg 微信支付

微信支付

Solvarg 支付宝

支付宝

Solvarg 贝宝

贝宝