首页/ 第 8 章 · 输入系统/ 第 121 课
LESSON 121 · 输入系统

CharacterController 角色控制器

CharacterController 已掌握。下一课让输入与动画联动。

⏱ 约 15 分钟📊 难度:入门🗂 第 8 章 · 输入系统📍 第 121 / 300 课
课程进度
121 / 300

🎯本节学习目标

  • 理解 CharacterController 特点
  • 掌握 Move 移动
  • 实现重力与跳跃

🚀课程导读

CharacterController 是 Unity 专门为“角色”设计的控制器:不参与物理、斜坡台阶稳定、不会乱撞。很多游戏用它做角色。

CharacterController 基础

“人形胶囊移动器”。

  1. 给角色添加 CharacterController 组件(会自动去掉 Rigidbody 需求)。
  2. 它自带一个胶囊体(Height/Radius 可调),负责“碰撞与阻挡”但不参与物理力。
  3. 【核心方法 Move】cc.Move(位移向量); 每帧调用,传入本帧位移(含 deltaTime)。
  4. 【简单移动】
  5. CharacterController cc = GetComponent<CharacterController>();
  6. Vector3 move = new Vector3(h, 0, v) * speed * Time.deltaTime;
  7. cc.Move(move);
  8. 【区别】Move 自动处理碰撞(撞墙停下、上下坡)。
  9. 【SimpleMove】(旧)自动乘速度与 deltaTime,不能控制 Y。
  10. 【isGrounded 属性】cc.isGrounded 直接判断是否在地面,无需自己检测!
💡
CharacterController 的 isGrounded 内置,省去地面检测代码,这是它的一大优点。

重力与跳跃(CC 版)

手动模拟重力。

  1. CC 不自动受重力,需要自己累积垂直速度:
  2. private float verticalVel = 0f;
  3. private float gravity = -9.81f;
  4. void Update() {
  5. if (cc.isGrounded && verticalVel < 0) { verticalVel = -1f; } // 贴地
  6. if (Input.GetKeyDown(KeyCode.Space) && cc.isGrounded) { verticalVel = 8f; }
  7. verticalVel += gravity * Time.deltaTime;
  8. Vector3 move = new Vector3(h, verticalVel, v) * Time.deltaTime;
  9. cc.Move(move);
  10. }
  11. 【说明】垂直速度持续加重力,落地归零。
  12. 【对比】CC 方案适合“精确控制型”角色;刚体适合“物理交互型”物体。
  13. 【优点】CC 不会把角色撞飞、不会穿透斜坡、上下坡平滑。
  14. 【注意】CC 与刚体混用会互相干扰,选一种方案。
CharacterController 方案 = Move 移动 + 手动重力 + isGrounded 跳跃,是“手感型”角色的首选。

常见错误与排查

错误:CC 角色穿地/抖动?
原因:重力累积与地面检测冲突
解决:isGrounded 且 verticalVel<0 时强制贴地(verticalVel=-1);Move 在 Update 里调用。

动手练习

课后小任务(做出来才算真的学会)

  • 用 CharacterController 实现移动
  • 实现手动重力与跳跃
  • 对比 CC 与刚体移动的手感差异

本节小结

CharacterController 已掌握。下一课让输入与动画联动。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课跳跃与重力模拟(角色控制器)