动画控制

1.4k words

描述

记录战斗系统中,用到的动画知识点

效果

Curves

在 AnimationClip 的 Curves 中设置,控制 Parameters 的变化
在播放动画中,设置 AnimationMove 值,脚本通过读取这个值,控制人物进行偏移

1
2
3
4
5
6
private void UpdateAnimation() {
if (characterAnimator.CheckAnimationTag("Battle"))
{
CharacterMoveInterface(transform.forward, characterAnimator.GetFloat(animationMoveID) * animationMoveScale, true);
}
}

Events

在 AnimationClip 的 Events 中设置,进行事件的派发

攻击者

OnAnimationAttackEvent事件,进行攻击事件的派发,参数为 hit_light(轻攻击)/hit_weight(重攻击)/hit_fly(击飞)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
protected virtual void OnAnimationAttackEvent(string hitName) {
if (!animator.CheckAnimationTag(AnimationTag.Battle)) {
return;
}
Collider[] collider = new Collider[4];
//TODO 后续加入BVH优化
int count = Physics.OverlapSphereNonAlloc(attackDetectionCenter.position, attackDetectionRange,collider,enemyLayer);
for (int i = 0; i < count; i++) {
if (collider[i].TryGetComponent(out IDamager damager)) {
damager.TakeDamager(hitName);
}
}
//TODO 音效播放

//TODO 血液
}

受击者

定义接口 IDamager ,定义几种受击时的接口

IDamager
1
2
3
4
void TakeDamager(float damager);
void TakeDamager(string hitAnimationName);
void TakeDamager(float damager, string hitAnimationName);
void TakeDamager(float damagar, string hitAnimationName, Transform attacker);

在受击动画中添加受击事件,控制角色位移

1
2
3
4
5
6
protected virtual void HitAnimationMove() {
if (!animator.CheckAnimationTag(AnimationTag.Hit)) {
return;
}
movement.CharacterMoveInterface(hitDir, animator.GetFloat(animationMove)* hitAnimationMoveMult, true);
}

来源

bilibili