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

Unity中使用AddForce实现GameObject跳跃失效问题求助

问题排查与修复方案

以下是针对你代码中跳跃失效问题的具体修复步骤:

1. 修正跳跃触发时机

你当前用Input.GetMouseButtonUp(0)检测输入,这个逻辑仅在鼠标左键抬起瞬间触发,很容易错过操作。换成Input.GetMouseButtonDown(0),它会在左键按下瞬间触发,响应更灵敏:

IsClicked = Input.GetMouseButtonDown(0);

2. 修复地面检测的射线盲区

原代码的射线从物体中心发射,如果物体自身有碰撞体,射线可能直接撞在自己身上,导致IsOnGround()判断错误。调整射线起点和长度,确保能准确检测地面:

bool IsOnGround()
{
    // 从物体底部偏移一点的位置发射射线,避免自身碰撞体遮挡
    Vector3 rayStart = transform.position + Vector3.down * 0.1f;
    // 射线长度设为物体中心到地面的距离+0.1,确保覆盖地面检测范围
    float rayLength = distancetoground + 0.1f;
    // 可选:Scene视图中显示射线,方便调试
    Debug.DrawRay(rayStart, Vector3.down * rayLength, Color.red);
    return Physics.Raycast(rayStart, Vector3.down, rayLength);
}

同时要在Start()里正确初始化distancetoground和刚体组件:

private float distancetoground;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
    // 获取物体碰撞体的下半部分到中心的距离
    Collider col = GetComponent<Collider>();
    if(col != null)
    {
        distancetoground = col.bounds.extents.y;
    }
}

3. 统一移动方式避免物理冲突

你同时用transform.Translate()直接修改位置和rb.AddForce()的物理驱动,可能导致运动逻辑冲突。建议用刚体控制移动,遵循物理规则:

// 替换原有的Translate移动代码
Vector3 moveDir = transform.forward * translation;
rb.MovePosition(rb.position + moveDir);

4. 检查刚体组件配置

确保你的GameObject上的Rigidbody组件满足:

  • 取消勾选Is Kinematic(运动学刚体不会响应AddForce)
  • 勾选Use Gravity(否则物体不会下落,一直处于空中导致跳跃条件不满足)

修复后的完整代码示例

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float playerSpeed = 5f;
    public float playerRotationSpeed = 100f;
    public float jumpForce = 5f;
    private float distancetoground;
    private Rigidbody rb;
    private bool IsClicked;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        Collider col = GetComponent<Collider>();
        if(col != null)
        {
            distancetoground = col.bounds.extents.y;
        }
    }

    void Update()
    {
        float translation = Input.GetAxis("Vertical") * playerSpeed * Time.deltaTime;
        float rotation = Input.GetAxis("Horizontal") * playerRotationSpeed * Time.deltaTime;

        IsClicked = Input.GetMouseButtonDown(0);
       
        if (IsClicked && IsOnGround())
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }

        Vector3 moveDir = transform.forward * translation;
        rb.MovePosition(rb.position + moveDir);
        transform.Rotate(0, rotation, 0);
    }

    bool IsOnGround()
    {
        Vector3 rayStart = transform.position + Vector3.down * 0.1f;
        float rayLength = distancetoground + 0.1f;
        Debug.DrawRay(rayStart, Vector3.down * rayLength, Color.red);
        return Physics.Raycast(rayStart, Vector3.down, rayLength);
    }
}

内容的提问来源于stack exchange,提问作者Ike Muoma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:40:35