CharacterController 和 RigidBody 比较

Rigidbody

  • 物理基础Rigidbody依赖于Unity的物理引擎来模拟真实世界的物理行为,包括重力、摩擦和碰撞。适用于需要精确物理交互的游戏对象。
  • 移动方法:可以使用MovePositionMoveRotation来在保持物理效果的情况下移动和旋转游戏对象。这些方法在处理物体移动和旋转时考虑到物理碰撞和其他相互作用,避免穿透和非自然的物理行为。

CharacterController

  • 非物理交互CharacterController设计用于控制角色移动,不依赖物理引擎处理碰撞和移动,而是使用碰撞检测来避免穿越障碍物,适用于需要精细控制角色行为的游戏,如平台或第三人称射击游戏。
  • 移动方法CharacterControllerMove方法用于移动角色,但不直接处理旋转,旋转需要通过修改Transform的旋转属性来实现。Move方法在移动时会考虑碰撞,自动调整路径以适应障碍物,避免角色穿透或“卡在”其他物体中。

Rigidbody移动方式

  1. MovePosition

    • 描述Rigidbody.MovePosition是一个使刚体(Rigidbody)沿物理引擎计算的安全路径移动到新位置的方法。这种方式考虑了物理碰撞和交互,适合在需要精确物理模拟的情况下使用。

    • 使用场景:例如,在模拟一个物体在受力后滑动到停止的场景中使用,或者在需要确保物体在移动过程中不穿透其他物体时使用。

    • 代码示例

      void FixedUpdate() {
          Vector3 newPosition = rigidbody.position + velocity * Time.deltaTime;
          rigidbody.MovePosition(newPosition);
      }
      
  2. MoveRotation

    • 描述Rigidbody.MoveRotation用于以物理正确的方式旋转刚体。这个方法在旋转时考虑物理碰撞,避免旋转导致的物体穿透问题。

    • 使用场景:当你需要旋转一个物体,同时考虑到与其他物体的碰撞或交互效果时,比如在车辆或机器人的物理模拟中。

    • 代码示例

      void FixedUpdate() {
          Quaternion deltaRotation = Quaternion.Euler(new Vector3(0, 100, 0) * Time.deltaTime);
          rigidbody.MoveRotation(rigidbody.rotation * deltaRotation);
      }
      

CharacterController移动方式

  1. Move
    • 描述CharacterController.Move是一个将角色沿指定向量移动的方法。此方法处理角色与环境的碰撞检测和响应,但不通过物理引擎来模拟碰撞效果,而是确保角色不会穿透或嵌入碰撞体。如果移动路径上有任何碰撞体,CharacterController 会自动调整路径以避免穿透碰撞体,并停在碰撞体表面。

    • 使用场景:广泛用于控制玩家角色或NPC的移动,尤其是在平台跳跃游戏或其他需要精确控制角色位置的场景中。

    • 代码示例

      void Update() {
          Vector3 move = new Vector3(Input.GetAxis("Horizontal"), -gravity, Input.GetAxis("Vertical"));
          move = transform.TransformDirection(move);
          characterController.Move(move * Time.deltaTime);
      }
      
  2. 旋转
    • 描述:如果你需要旋转 CharacterController 所附加的对象,你需要使用 transform 组件来单独处理旋转。例如,你可以根据用户输入来旋转角色,以确保角色面向移动方向:

    • 代码示例:

      void Update() {
          float inputX = Input.GetAxis("Horizontal");
          float inputZ = Input.GetAxis("Vertical");
          Vector3 moveDirection = new Vector3(inputX, 0, inputZ);
      
          if (moveDirection != Vector3.zero) {
              // 创建面向移动方向的旋转
              Quaternion newRotation = Quaternion.LookRotation(moveDirection);
              transform.rotation = Quaternion.Slerp(transform.rotation, newRotation, Time.deltaTime * rotationSpeed);
          }
      
          characterController.Move(moveDirection * Time.deltaTime * moveSpeed);
      }
      
      

总结

  • Rigidbody:依赖物理引擎,适合需要真实物理交互的场景,如物体碰撞、掉落等。
  • CharacterController:不依赖物理引擎的碰撞响应,适合需要高度控制移动和避免穿透的游戏角色控制,如跑酷、射击游戏中的角色移动。

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值