Unity缩放FPS角色后地面检测Raycast失效问题求助
问题原因
- 你代码中硬编码了
playerHeight = 2f,这个值是胶囊体碰撞器在局部坐标系下的初始高度,当你修改了角色GameObject的缩放值后,碰撞器在世界坐标系下的实际高度会同步跟随Y轴缩放系数变化,你当前的检测距离没有适配缩放后的实际高度,导致射线长度不足,无法触达地面,所以isOnGround一直返回false。 - 额外问题:
ForceMode.Impulse为瞬间力模式,不需要乘Time.deltaTime,该参数仅用于持续力模式(如ForceMode.Force),你当前的写法会导致跳跃高度跟随帧率波动,属于隐藏BUG。
修复方案
修改后的完整代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class checkJump : MonoBehaviour { private Rigidbody rb; private CapsuleCollider playerCollider; private bool isOnGround; private float jumpSpeed = 400f; void Start() { rb = GetComponent<Rigidbody>(); playerCollider = GetComponent<CapsuleCollider>(); } void Update() { // 动态计算世界坐标系下胶囊体实际半高,加0.1f作为检测余量 float realHalfHeight = playerCollider.height * transform.lossyScale.y / 2 + 0.1f; isOnGround = Physics.Raycast(transform.position, Vector3.down, realHalfHeight); Jump(); Debug.Log(isOnGround); } void Jump() { if (Input.GetKeyDown(KeyCode.Space) && isOnGround) { // Impulse模式无需乘以Time.deltaTime rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse); } } }
核心改动点:
- 新增
CapsuleCollider成员变量,直接读取碰撞器的高度配置,避免硬编码高度导致的适配问题 - 检测距离计算引入
transform.lossyScale.y(世界坐标系下的Y轴缩放系数),动态计算实际半高,适配任意缩放值的角色 - 移除跳跃加力逻辑中的
Time.deltaTime,修复跳跃高度受帧率影响的问题
内容的提问来源于stack exchange,提问作者milkastronaut34
相关产品推荐
相关产品推荐

