You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:06:03