Rigidbody
- 物理基础:
Rigidbody
依赖于Unity的物理引擎来模拟真实世界的物理行为,包括重力、摩擦和碰撞。适用于需要精确物理交互的游戏对象。 - 移动方法:可以使用
MovePosition
和MoveRotation
来在保持物理效果的情况下移动和旋转游戏对象。这些方法在处理物体移动和旋转时考虑到物理碰撞和其他相互作用,避免穿透和非自然的物理行为。
CharacterController
- 非物理交互:
CharacterController
设计用于控制角色移动,不依赖物理引擎处理碰撞和移动,而是使用碰撞检测来避免穿越障碍物,适用于需要精细控制角色行为的游戏,如平台或第三人称射击游戏。 - 移动方法:
CharacterController
的Move
方法用于移动角色,但不直接处理旋转,旋转需要通过修改Transform
的旋转属性来实现。Move
方法在移动时会考虑碰撞,自动调整路径以适应障碍物,避免角色穿透或“卡在”其他物体中。
Rigidbody移动方式
-
MovePosition
-
描述:
Rigidbody.MovePosition
是一个使刚体(Rigidbody)沿物理引擎计算的安全路径移动到新位置的方法。这种方式考虑了物理碰撞和交互,适合在需要精确物理模拟的情况下使用。 -
使用场景:例如,在模拟一个物体在受力后滑动到停止的场景中使用,或者在需要确保物体在移动过程中不穿透其他物体时使用。
-
代码示例:
void FixedUpdate() { Vector3 newPosition = rigidbody.position + velocity * Time.deltaTime; rigidbody.MovePosition(newPosition); }
-
-
MoveRotation
-
描述:
Rigidbody.MoveRotation
用于以物理正确的方式旋转刚体。这个方法在旋转时考虑物理碰撞,避免旋转导致的物体穿透问题。 -
使用场景:当你需要旋转一个物体,同时考虑到与其他物体的碰撞或交互效果时,比如在车辆或机器人的物理模拟中。
-
代码示例:
void FixedUpdate() { Quaternion deltaRotation = Quaternion.Euler(new Vector3(0, 100, 0) * Time.deltaTime); rigidbody.MoveRotation(rigidbody.rotation * deltaRotation); }
-
CharacterController移动方式
- 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); }
-
- 旋转
-
描述:如果你需要旋转
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:不依赖物理引擎的碰撞响应,适合需要高度控制移动和避免穿透的游戏角色控制,如跑酷、射击游戏中的角色移动。