首页/ 第 9 章 · 动画系统/ 第 143 课
LESSON 143 · 动画系统

IK 反向动力学

IK 已掌握。下一课学布娃娃 Ragdoll。

⏱ 约 14 分钟📊 难度:入门🗂 第 9 章 · 动画系统📍 第 143 / 300 课
课程进度
143 / 300

🎯本节学习目标

  • 理解 IK 概念
  • 掌握 OnAnimatorIK
  • 实现手抓取/脚踩地

🚀课程导读

“手要抓到门把手”“脚要踩在斜坡上”——正向动画做不到,靠 IK(反向动力学)根据目标反推骨骼姿态。

IK 概念

“从结果反推姿势”。

  1. 【正向动力学 FK】动画直接指定骨骼旋转,手就到哪算哪。
  2. 【反向动力学 IK】给定“手要到达的点”,系统反算肩肘手腕的旋转让手够到。
  3. 【典型应用】手抓物体、脚踩地形、视线看目标、头部跟随。
  4. 【人形 IK】Unity 人形模型内置 IK 支持(必须 Humanoid + Avatar)。
  5. 【触发时机】在 OnAnimatorIK(int layerIndex) 方法里写 IK 逻辑(每帧动画更新时调用)。
  6. 【前提】脚本挂角色上,且角色 Animator 是 Humanoid。
  7. 【层】OnAnimatorIK 的 layerIndex 参数对应当前动画层。
💡
IK = “目标点 → 反推姿势”。它让角色“够得着”“踩得稳”。

实现手抓取与脚踩地

实战两例。

  1. 【手抓取】在角色脚本里写:
  2. public Transform handTarget; // 要抓的目标(如门把手)
  3. public float handWeight = 1f;
  4. void OnAnimatorIK(int layerIndex) {
  5. Animator anim = GetComponent<Animator>();
  6. if (handTarget != null) {
  7. anim.SetIKPositionWeight(AvatarIKGoal.RightHand, handWeight);
  8. anim.SetIKRotationWeight(AvatarIKGoal.RightHand, handWeight);
  9. anim.SetIKPosition(AvatarIKGoal.RightHand, handTarget.position);
  10. anim.SetIKRotation(AvatarIKGoal.RightHand, handTarget.rotation);
  11. }
  12. }
  13. 【脚踩地形】用射线检测脚下地面高度,设置双脚 IK:
  14. anim.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1f);
  15. anim.SetIKPosition(AvatarIKGoal.LeftFoot, footPos);
  16. 【权重】Weight 0-1 控制 IK 影响程度(可平滑过渡)。
  17. 【AvatarIKGoal】枚举:LeftHand/RightHand/LeftFoot/RightFoot/LeftShoulder 等。
  18. 【注意】IK 在动画之上叠加,权重 0=纯动画、1=完全 IK。
  19. 【调试】用 Debug.DrawRay 画出 IK 目标点。
  20. 【性能】IK 计算有成本,按需启用(近处才开)。
IK 公式:SetIKPositionWeight(目标, 权重) + SetIKPosition(目标, 点)。两行实现“够得到”。

常见错误与排查

错误:IK 没效果?
原因:模型不是 Humanoid、或权重为 0、或没在 OnAnimatorIK 里写
解决:确认 Humanoid+Avatar;权重设 1;方法名写对 OnAnimatorIK。

动手练习

课后小任务(做出来才算真的学会)

  • 实现右手抓取一个目标点
  • 用射线让脚贴合地面坡度
  • 用权重做 IK 淡入淡出

本节小结

IK 已掌握。下一课学布娃娃 Ragdoll。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课动画控制器脚本控制(SetTrigger 等)