首页/ 第 7 章 · 物理系统/ 第 106 课
LESSON 106 · 物理系统

移动平台与传送带

移动平台与传送带已实现。下一课学物体跟随与注视。

⏱ 约 14 分钟📊 难度:入门🗂 第 7 章 · 物理系统📍 第 106 / 300 课
课程进度
106 / 300

🎯本节学习目标

  • 实现移动平台
  • 实现传送带
  • 实现“站在上面跟着走”

🚀课程导读

“站上电梯一起升”是 3D 游戏常见关卡元素。本课实现移动平台与传送带。

移动平台

让平台来回/上下移动。

  1. 创建平台:Cube 拉长拉扁,命名为 Platform。
  2. 给平台加 Rigidbody,勾选【Is Kinematic】(运动学:由代码移动,不影响物理碰撞但会推人)。
  3. 新建脚本 MovingPlatform 挂到平台:
  4. public Vector3 offset = new Vector3(4, 0, 0); public float speed = 2f;
  5. private Vector3 startPos;
  6. void Start() { startPos = transform.position; }
  7. void Update() { transform.position = startPos + offset * Mathf.Sin(Time.time * speed); }
  8. 【Mathf.Sin】正弦波让平台来回平滑移动(值在 -1 到 1 之间循环)。
  9. 播放:平台来回滑动。
  10. 【“乘客”效果】玩家站在平台上会跟着平台一起走吗?需要“玩家平台检测”(下一步)。
💡
Is Kinematic 平台 + 移动 = 能推人走的基础;但它不会“自动带走”站立者,需乘客系统。

乘客系统与传送带

让玩家被平台“带着走”。

  1. 【乘客系统】在玩家脚本里检测脚下是否有移动平台:
  2. void OnCollisionEnter(Collision c) { if (c.gameObject.CompareTag("Platform")) { platform = c.transform; } }
  3. void OnCollisionExit(Collision c) { if (c.gameObject.CompareTag("Platform")) { platform = null; } }
  4. Update 里:if (platform != null) { transform.position += platform.position - platformLastPos; } 记录平台上一帧位置,把差值叠加给玩家。
  5. 【传送带】给平面加刚体(Kinematic)+ 碰撞体,写脚本:
  6. void OnCollisionStay(Collision c) { Rigidbody rb = c.rigidbody; if (rb != null) { rb.AddForce(Vector3.right * force); } }
  7. 或直接对站立者施加“传送带方向”的力。
  8. 【更稳方案】用 CharacterController.Move 的角色可用平台速度辅助(进阶)。
  9. 【注意】平台与玩家都要有碰撞体,平台 Kinematic。
  10. 【验证】让玩家站上平台,观察是否被带着移动。
⚠️
乘客系统的关键是“记录平台每帧位移并叠加给玩家”,忘了记录就完全失效。

常见错误与排查

错误:玩家站在平台上会抖动/穿透?
原因:玩家或平台物理配置冲突
解决:平台用 Is Kinematic;玩家用刚体且 Collision Detection 调 Continuous;差值叠加要乘 deltaTime 的由平台速度驱动。

动手练习

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

  • 做一个来回移动的平台
  • 让玩家站在上面被带着走
  • 实现一条把物体推走的传送带

本节小结

移动平台与传送带已实现。下一课学物体跟随与注视。

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

← 上一课重力调节与自定义重力