• CharacterController 角色控制器
    • 示例:
      • CharacterController.Move 移动
      • CharacterController.SimpleMove 简单移动
      • CollisionFlags 碰撞标识

    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. }

    ?