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

Unity动画结束后对象返回初始位置,如何使其停在最终位置?

解决动画结束后返回初始位置的问题

一、核心解决方案(针对Animator组件)

1. 修改动画片段的基础设置

打开你的动画片段(.anim文件),在Inspector面板里做两个调整:

  • 取消勾选Loop Time,避免动画循环播放;
  • 将Wrap Mode设置为ClampForever,这样动画播放到最后一帧就会停住,不会倒退回初始状态。

2. 关闭Animator状态的「Write Defaults」

在Animator窗口中找到播放该动画的状态,在Inspector面板里取消勾选Write Defaults。这个选项会在状态退出时把对象属性重置为默认值,取消后就能保留动画最后一帧的位置和旋转。

3. 添加动画事件锁定Transform

如果上面的方法不生效,可以给动画添加结束事件,手动锁定对象的最终状态:

  1. 打开动画片段,在时间轴的最后一帧右键选择「Add Animation Event」;
  2. 在脚本中添加如下回调方法:
    public void LockFinalState()
    {
        // 锁定当前位置和旋转
        var finalPos = transform.position;
        var finalRot = transform.rotation;
        transform.position = finalPos;
        transform.rotation = finalRot;
        // 禁用Animator,防止后续状态影响
        _animator.enabled = false;
    }
    
  3. 把这个方法拖到Animation Event的「Function」字段中,动画结束时就会触发锁定。

二、Animation与Animator组件的区别

  • Animation组件:Unity旧版动画系统,适合简单线性动画(比如单个循环动画)。它直接管理动画片段的播放、暂停、循环模式,不需要状态机。现在主要用于兼容旧项目,新项目不推荐使用。
  • Animator组件:Unity Mecanim动画系统,基于状态机(State Machine),适合复杂动画逻辑(比如角色多状态切换)。通过Animator Controller管理多个动画状态和过渡,支持参数(Trigger、Bool等)触发切换,是当前Unity的主流动画方案。
  • 两者关联:Animator可以包含多个Animation片段,通过状态机控制播放逻辑;而Animation组件只能直接操控片段,没有状态切换能力。

关于ApplyRootMotion的说明

开启Animator.ApplyRootMotion后,动画的根运动位移会直接作用于对象Transform,导致动画从当前位置开始播放(而非你设置的初始位置)。如果你的动画是基于绝对位置制作的,应该关闭ApplyRootMotion,确保动画按预设的初始→最终位置执行。

内容的提问来源于stack exchange,提问作者dkalkwarf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:35:02