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

Unity角色控制重力添加方法及脚本无法添加重力的问题排查

嘿,我来帮你搞定这个Unity第一人称角色的重力问题!首先得明确:CharacterController组件本身不会自动处理重力,所有垂直方向的运动(包括自由下落)都需要咱们手动写逻辑实现。你的原始脚本应该是缺失了垂直速度管理和重力累加的核心代码,下面是具体的修复步骤和完整示例:

解决Unity第一人称角色控制的重力添加问题

1. 先补全关键变量

首先在类里添加几个控制重力、垂直速度的必要变量,要是需要跳跃功能也可以一起加上:

public float gravity = -9.81f; // 重力值,负数代表向下的力,-9.81是贴近真实的数值
public float jumpForce = 3f; // 可选:跳跃时的向上力
private float verticalVelocity; // 存储垂直方向的实时速度

2. 编写重力核心逻辑

在处理角色移动的代码块(一般是Update或FixedUpdate)里,加入重力计算逻辑:

  • 当角色站在地面上时(controller.isGrounded为true),把垂直速度重置为一个很小的负数(比如-0.1f),避免角色悬浮在空中,同时允许触发跳跃;
  • 当角色离开地面时,持续给垂直速度累加重力值,模拟自由下落的加速度;
  • 最后把垂直速度整合到角色的移动向量里,传给CharacterController.Move()方法。

3. 完整修改后的脚本

我把你的原始脚本补全并标注了重力相关的修改部分,你可以直接参考:

using UnityEngine;
using TouchControlsKit;

namespace Examples
{
    public class FirstPersonExample : MonoBehaviour
    {
        bool binded;
        Transform myTransform, cameraTransform;
        CharacterController controller;
        float rotation;
        bool jump, prevGrounded, isPorjectileCube;
        float weapReadyTime;
        bool weapReady = true;

        // 新增:重力与跳跃相关变量
        public float gravity = -9.81f;
        public float jumpForce = 3f;
        private float verticalVelocity;

        void Awake()
        {
            myTransform = transform;
            cameraTransform = Camera.main.transform;
            controller = GetComponent<CharacterController>();
        }

        void Update()
        {
            // 初始化移动向量
            Vector3 moveDirection = Vector3.zero;

            // 保留你原本的水平移动输入逻辑(比如从TouchControlsKit获取摇杆输入)
            if (TCKInput.GetAction("Horizontal"))
            {
                Vector2 input = TCKInput.GetAxis("Horizontal");
                moveDirection = myTransform.right * input.x + myTransform.forward * input.y;
                moveDirection.Normalize();
                // 这里可以添加移动速度控制,比如乘以一个speed变量
            }

            // --- 重力与垂直运动处理 开始 ---
            if (controller.isGrounded)
            {
                // 角色在地面时,重置垂直速度为小负数,防止悬浮
                verticalVelocity = -0.1f;

                // 处理跳跃逻辑(如果需要)
                if (jump)
                {
                    verticalVelocity = jumpForce;
                    jump = false;
                }
            }
            else
            {
                // 不在地面时,持续累加重力,模拟下落加速度
                verticalVelocity += gravity * Time.deltaTime;
            }

            // 将垂直速度整合到移动向量中
            moveDirection.y = verticalVelocity;
            // --- 重力与垂直运动处理 结束 ---

            // 执行角色移动
            controller.Move(moveDirection * Time.deltaTime);

            // 保留你原本的相机旋转等其他逻辑
            if (TCKInput.GetAction("Look"))
            {
                Vector2 lookInput = TCKInput.GetAxis("Look");
                rotation += lookInput.x;
                myTransform.rotation = Quaternion.Euler(0, rotation, 0);
                cameraTransform.Rotate(-lookInput.y, 0, 0);
            }
        }
    }
}

4. 常见问题排查

如果添加后还是没有重力效果,可以检查这几点:

  • 确认CharacterController组件已经正确挂载在角色对象上;
  • 检查重力值是否设置合理(不要太小,比如-9.81是比较合适的数值);
  • 确保controller.isGrounded判断有效:CharacterController的地面检测需要角色胶囊体和地面碰撞体的层设置正确,没有被碰撞矩阵忽略;
  • 检查移动向量的y轴是否真的被verticalVelocity赋值,没有被其他代码意外覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:30:02