角色移动这条线,滑动讲了,解穿透讲了,但一直绕开了一个最基础的问题:角色到底怎么知道自己"站在地上"?这事听着比撞墙滑动简单,真做起来坑一点不少。而且它牵出另外两件连带的事——遇到台阶能不能自动迈上去、遇到斜坡能不能站住或者该不该往下滑。这三件事:Ground、Step、Slope,是拼在一起的,分开讲反而讲不清。这篇一次说完。照旧全程定点,单位米。
为什么"站在地上"是个需要判定的东西
你可能觉得,角色 y 坐标等于地面高度,不就是站在地上吗?没这么简单。
角色在竞技 FPS 里的行为高度依赖"我现在是不是踩着地":踩着地才能跳、才有正常的移动摩擦、才播放脚步声、才不受下落重力。一旦这个状态判错,连锁问题一大堆——明明站在地上却不能跳(判成了空中)、明明在空中却一直播脚步(判成了地面)、走个小坡就被当成起跳导致相机一抖一抖。
所以"是否着地"(grounded)不是一个坐标比较,是一个需要每帧主动检测、还得带点容差和迟滞的状态。这是三件事里的地基,先说它。
Ground:往脚下探一条短射线
判定着地的标准做法,是每帧从角色脚底往下投一个短距离的检测——射线或者一个薄薄的下扫(sweep),看脚下这么点距离内有没有地面。
● 角色 │ │ ← 脚底 ▼ 往下探一小段(probe 距离) ───┴─── 探到地面 → grounded = true /////// 探不到 → grounded = false(在空中)