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
相关产品推荐
相关产品推荐

