Unity中关键帧动画与物理引擎协同需设Rigidbody.isKinematic=false并用MovePosition对齐,否则动画绕过物理系统致穿墙、碰撞失效;高速运动应优先优化动画曲线,必要时启用ContinuousDynamic检测。

Composer 不是 Unity 的物理引擎,也不是标准开发工具链中用于物理模拟的组件。你很可能混淆了术语:Unity 使用的是 PhysX(通过 Rigidbody 和 Collider 驱动),而 Composer 是 Adobe After Effects 中的合成/动画工具,不参与实时物理计算,也不支持关键帧驱动的刚体碰撞模拟。
如果你实际想问的是「如何在 Unity 中用关键帧动画 + 物理引擎实现可信的碰撞效果」,那核心矛盾在于:**关键帧动画(如 Animation 或 Animator)默认绕过物理系统,直接写死 Transform,会无视 Rigidbody 和碰撞检测**。下面直说怎么做、为什么、踩什么坑。
关键帧动画物体撞不上其他刚体?检查 Is Kinematic 是否被误关
这是最常见失效原因:你给一个带 Animator 的角色加了 Rigidbody 和 BoxCollider,但动画仍能穿墙——因为 Rigidbody.isKinematic 默认为 true(尤其从 Legacy 动画迁移时)。它意味着“我只听动画指挥,不响应物理”。
- 若需动画驱动 + 碰撞阻挡(比如门被推开后挡住玩家),必须手动设
rb.isKinematic = false,并在动画关键帧后一帧调用rb.MovePosition()或启用Interpolate避免抖动 - 若需动画驱动 + 推动其他刚体(比如机械臂抓取箱子),必须设
isKinematic = false,且箱子一方也要有Rigidbody;否则推不动 - 切勿在
Update里每帧设isKinematic = false后又改回true——这会导致物理状态撕裂,碰撞判定丢失
OnCollisionEnter 不触发?确认双方 Collider 和 Rigidbody 的组合合法
Unity 的碰撞判定不是“有 Collider 就行”,而是依赖 PhysX 的配对规则。以下组合中,只有带 Rigidbody 的一方能触发 OnCollisionEnter:
- 静态物体(仅
Collider,无Rigidbody) + 动态物体(Rigidbody+Collider)→ ✅ 触发 - 两个都带
Rigidbody(且都非isKinematic)→ ✅ 触发 - 两个都是
isKinematic = true→ ❌ 不触发任何OnCollision*,只能靠OnTrigger*(需勾选Is Trigger) - 动画控制的
Transform.position直接赋值 → ❌ 绕过物理引擎,永远不触发
注意:OnTriggerEnter 要求至少一方是 Is Trigger,且双方都得有 Collider;但触发器不产生物理力,只发事件。
快速移动物体穿模?别只调 Collision Detection,先看是否真需要连续检测
把 Rigidbody.collisionDetectionMode 设成 Continuous 或 ContinuousDynamic 能减少高速穿透,但代价是 CPU 开销翻倍。多数情况穿模是因为动画本身帧率不足或关键帧间隔太大。
- 先检查动画曲线:在 Animation Window 中打开关键帧曲线,确认位移不是“跳变”(Jump),而是平滑贝塞尔插值
- 若必须高速运动(如子弹),用
Rigidbody+AddForce替代关键帧,再设collisionDetectionMode = ContinuousDynamic -
ContinuousSpeculative是 Unity 2021.2+ 新增模式,比Continuous更轻量,适合中速移动物体(如投掷物),但对极高速仍可能漏判
isKinematic 切换,得用 Rigidbody.MovePosition 在 FixedUpdate 中对齐动画骨骼位置,同时保留物理响应。这种细节没文档讲,但线上项目里几乎每个做动作系统的人都踩过。


















