Unity中CharacterController移动与跳跃功能冲突无法正常生效问题
Unity角色同时移动+跳跃功能异常修复方案
问题根源
两套代码使用了互不兼容的位移实现逻辑:
- 移动脚本直接修改
transform属性实现位移和旋转,绕过了CharacterController的碰撞和位移校验逻辑 - 跳跃脚本使用
CharacterController.Move()方法实现Y轴位移,两种位移方式会互相覆盖位置数据,导致移动异常、接地检测失效等问题
修复方案
将移动和跳跃的位移逻辑统一使用CharacterController.Move()实现,你可以直接用下面的合并后的单脚本替换原来的两个脚本:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { // 移动参数 public float speed = 30f; public float turnSpeed = 80f; // 跳跃参数 private float verticalVelocity; private float gravity = 14.0f; private float jumpForce = 10.0f; private CharacterController controller; private float horizontalInput; private float verticalInput; void Start() { controller = GetComponent<CharacterController>(); } void Update() { // 输入采集 horizontalInput = Input.GetAxis("Horizontal"); verticalInput = Input.GetAxis("Vertical"); // 旋转逻辑无冲突,可以保留 transform.Rotate(turnSpeed * Time.deltaTime * Vector3.up * horizontalInput); // 跳跃与重力逻辑 if (controller.isGrounded) { verticalVelocity = -gravity * Time.deltaTime; if (Input.GetKeyDown(KeyCode.Space)) { verticalVelocity = jumpForce; } } else { verticalVelocity -= gravity * Time.deltaTime; } // 合并前后移动和Y轴位移,统一用CharacterController处理 Vector3 moveVector = transform.forward * speed * verticalInput + new Vector3(0, verticalVelocity, 0); controller.Move(moveVector * Time.deltaTime); } }
注意事项
- 请确保你的角色对象上已经挂载了
CharacterController组件,根据你的角色模型尺寸调整组件的半径、高度、中心偏移参数 - 可以根据手感调整脚本暴露的speed、turnSpeed、jumpForce、gravity参数,适配项目需求即可
内容的提问来源于stack exchange,提问作者Nicolas Hume
相关产品推荐
相关产品推荐

