CharacterController 角色控制器

角色控制器让你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。

角色控制器不受力的影响,仅当你调用Move函数时才运动。它执行运动,但是受制于碰撞。

变量说明
center相对于变换位置的角色胶囊体的中心。
collisionFlags在最后的CharacterController.Move调用期间,胶囊体的哪个部分与周围环境相碰撞。
detectCollisions是否开启检测其他的刚体和角色控制器与本角色控制器碰撞(默认值始终启用)。
height角色胶囊体的高度。
isGrounded在最后一次移动角色控制器是否触碰地面?
radius角色胶囊体的半径。
slopeLimit角色控制器的坡度度数限制。
stepOffset以米为单位的角色控制器的台阶偏移量。
velocity角色当前的相对速度。
公有方法说明
Move一个更加复杂的运动函数,采取绝对的运动增量。
SimpleMove根据速度speed移动角色。
Message 消息说明
OnControllerColliderHit当角色控制器碰到一个可执行移动的碰撞器时,OnControllerColliderHit被调用。

示例:

CharacterController.Move 移动

public CollisionFlags**Move(Vector3** motion);

一个更加复杂的运动函数,采取绝对的运动增量。

尝试着通过motion移动控制器,motion只受限制于碰撞。它将沿着碰撞器滑动。CollisionFlags 是发生于Move的碰撞的概要。这个函数不应用任何重力。

  1. using UnityEngine;
  2. using System.Collections;
  3. public class ExampleClass : MonoBehaviour {
  4. public float speed = 6.0F;
  5. public float jumpSpeed = 8.0F;
  6. public float gravity = 20.0F;
  7. private Vector3 moveDirection = Vector3.zero;
  8. void Update() {
  9. CharacterController controller = GetComponent<CharacterController>();
  10. if (controller.isGrounded) {
  11. moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
  12. moveDirection = transform.TransformDirection(moveDirection);
  13. moveDirection *= speed;
  14. if (Input.GetButton("Jump"))
  15. moveDirection.y = jumpSpeed;
  16. }
  17. moveDirection.y -= gravity * Time.deltaTime;
  18. controller.Move(moveDirection * Time.deltaTime);
  19. }
  20. }

CharacterController.SimpleMove 简单移动

public bool SimpleMove(Vector3 speed);

根据速度speed移动角色。

Y 轴上速度被忽略。速度以米/秒为单位。重力被自动应用。如果角色着地返回 true。建议每帧只调用一次 Move 或者 SimpleMove。

  1. using UnityEngine;
  2. using System.Collections;
  3. [RequireComponent(typeof(CharacterController))]
  4. public class ExampleClass : MonoBehaviour {
  5. public float speed = 3.0F;
  6. public float rotateSpeed = 3.0F;
  7. void Update() {
  8. CharacterController controller = GetComponent<CharacterController>();
  9. transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0);
  10. Vector3 forward = transform.TransformDirection(Vector3.forward);
  11. float curSpeed = speed * Input.GetAxis("Vertical");
  12. controller.SimpleMove(forward * curSpeed);
  13. }
  14. }

CollisionFlags 碰撞标识

CollisionFlags是CharacterController.Move返回的位掩码。

枚举项说明
None没有碰撞到其他碰撞体
Sides角色控制器的边缘与其他碰撞框发生碰撞
Above角色控制器的上部与其他碰撞框发生碰撞
Below角色控制器的下部与其他碰撞框发生碰撞
  1. using UnityEngine;
  2. using System.Collections;
  3. public class ExampleClass : MonoBehaviour {
  4. void Update() {
  5. CharacterController controller = GetComponent<CharacterController>();
  6. if ((controller.collisionFlags & CollisionFlags.Above) != 0)
  7. print("touched the ceiling");
  8. }
  9. }
  1. using UnityEngine;
  2. using System.Collections;
  3. public class Test : MonoBehaviour {
  4. //角色控制器组件在与具有非触发器的Collider组件对象之间的碰撞 无法检测与触发器的Collider碰撞
  5. void OnControllerColliderHit(ControllerColliderHit hit)
  6. {
  7. //判断碰撞的对象是否具备刚体组件
  8. GameObject hitObject = hit.collider.gameObject;
  9. Rigidbody rigidbody = hitObject.rigidbody;
  10. if(rigidbody != null && !rigidbody.isKinematic)
  11. {
  12. //地面也具备刚体组件,这里判断一下
  13. if(!hitObject.name.Equals("Terrain") )
  14. {
  15. rigidbody.AddForce(new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z) * 10);
  16. }
  17. }
  18. }
  19. }

?