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

Unity玩家移动异常求助:速度过慢、无法跳跃、斜向移动过快

Unity玩家移动问题修复方案

问题现象

  • 无论调整多大的moveSpeed参数,玩家移动速度始终极慢
  • 按下空格键无法触发跳跃动作
  • 斜向(同时按前后+左右)移动时,速度明显快于正方向移动

原PlayerMovement脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 10f;
    public float jumpForce = 10f;
    public float groundCheckRadius = 0.2f;
    public LayerMask groundLayer;

    private Rigidbody rb;
    private bool isGrounded;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        float horizontalInput = Input.GetAxisRaw("Horizontal");
        float verticalInput = Input.GetAxisRaw("Vertical");

        Vector3 moveDirection = (transform.right * horizontalInput + transform.forward * verticalInput) * moveSpeed;
        rb.MovePosition(transform.position + moveDirection * Time.deltaTime);

        isGrounded = Physics.CheckSphere(transform.position, groundCheckRadius, groundLayer);

        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}

已尝试的无效方案

  • 将Update改为FixedUpdate并替换Time.deltaTime为Time.fixedDeltaTime,导致移动速度异常过快
  • 替换Input.GetAxisRaw为Input.GetAxis,移动过度平滑,不符合响应性要求
  • 移除Time.deltaTime,出现移动卡顿和穿墙问题
  • 修改跳跃逻辑为直接设置rb.velocity.y = jumpForce,仍无法触发跳跃

问题根源与修复步骤

1. 斜向速度过快+移动速度过慢

  • 根源:斜向移动时,transform.right + transform.forward的向量模长大于1(约1.414),直接乘以moveSpeed会导致速度翻倍;同时rb.MovePosition的方式未结合物理引擎特性,若Rigidbody有阻力或质量设置不当,会进一步降低实际移动速度。
  • 修复:
    • 对移动方向向量做归一化处理,确保正方向和斜向移动速度一致
    • 改用修改Rigidbody.velocity的方式控制移动,更符合物理引擎逻辑,避免穿墙
    • 检查Rigidbody设置:将Drag设为0,Mass设为1,避免速度被过度衰减

2. 跳跃无效

  • 根源:地面检测的Sphere中心在玩家模型原点(通常在躯干),而非脚部,导致落地时无法正确检测到地面;jumpForce数值过小,不足以克服重力和质量。
  • 修复:
    • 将地面检测点偏移到玩家脚部(可通过空物体或直接向量偏移实现)
    • 增大jumpForce数值(建议改为30f)

修复后的完整脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 10f;
    public float jumpForce = 30f;
    public float groundCheckRadius = 0.2f;
    public LayerMask groundLayer;
    public Transform groundCheckPoint; // 可在Inspector中拖入脚部空物体,无则自动偏移

    private Rigidbody rb;
    private bool isGrounded;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        // 初始化Rigidbody参数,避免物理特性干扰
        rb.drag = 0f;
        rb.angularDrag = 0.05f;
        rb.useGravity = true;
    }

    void Update()
    {
        float horizontalInput = Input.GetAxisRaw("Horizontal");
        float verticalInput = Input.GetAxisRaw("Vertical");

        // 处理移动:归一化方向,保持Y轴速度不受影响
        Vector3 moveDirection = transform.right * horizontalInput + transform.forward * verticalInput;
        if (moveDirection.magnitude > 1f)
        {
            moveDirection.Normalize();
        }
        Vector3 targetVelocity = new Vector3(moveDirection.x * moveSpeed, rb.velocity.y, moveDirection.z * moveSpeed);
        rb.velocity = targetVelocity;

        // 处理地面检测:优先使用指定检测点,否则自动向下偏移到脚部区域
        Vector3 groundCheckPos = groundCheckPoint != null ? groundCheckPoint.position : transform.position + Vector3.down * 0.5f;
        isGrounded = Physics.CheckSphere(groundCheckPos, groundCheckRadius, groundLayer);

        // 处理跳跃:仅在接地时触发
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:47:41