能否无需为每个攻击动画创建状态,在运行时修改状态Motion实现随机播放?
运行时修改动画状态Motion实现多武器攻击动画复用
完全可以通过运行时修改动画状态的Motion属性,避免为每个攻击动画单独创建状态,实现同一状态复用不同动画的效果。
实现思路
在Animator Controller中保留一个基础攻击状态,每次触发攻击时,根据当前武器类型随机选中对应的动画片段,直接替换该状态的Motion,再触发状态播放即可。
修改后的代码示例
private Animator _playerAnimator; private void Awake() { _playerAnimator = GetComponent<Animator>(); } public void PlayerBaseAttack() { var animationPair = attackAnimationList.Find(p => p.attackType == currentAttackType); if (animationPair == null || animationPair.animations.Length == 0) return; // 随机选中当前武器类型下的一个攻击动画 AnimationClip targetClip = animationPair.animations[Random.Range(0, animationPair.animations.Length)]; // 获取Animator基础层的状态机(根据你的层级索引调整,默认是0) AnimatorControllerLayer baseLayer = (_playerAnimator.runtimeAnimatorController as AnimatorController).layers[0]; // 找到基础攻击状态(替换成你实际的状态名称) AnimatorState baseAttackState = baseLayer.stateMachine.states .First(s => s.state.name == "BaseAttack").state; // 替换状态的Motion为选中的动画片段 baseAttackState.motion = targetClip; // 触发攻击状态播放(替换成你Animator中对应的触发参数名) _playerAnimator.SetTrigger("StartAttack"); }
注意事项
- 确保Animator Controller中存在对应的基础攻击状态,且状态名称与代码中一致。
- 层级索引
0对应Animator的基础层,如果你有多个动画层级,需要调整为目标层级的索引。 - 这种方式适合动画逻辑一致的场景(比如所有武器的基础攻击都是播放一段动画),如果不同攻击有独特的逻辑(比如不同的伤害判定、冷却逻辑),可能需要结合状态机行为(StateMachineBehaviour)来扩展,但单纯的动画切换完全可以用这种方式实现状态复用。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

