You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否无需为每个攻击动画创建状态,在运行时修改状态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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:23:27