描述
记录战斗系统中,用到的动画知识点
效果
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]; 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); } }
}
|
受击者
定义接口 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