1. 程式人生 > >CharacterController(角色控制器)

CharacterController(角色控制器)

CharacterController

描述:

角色控制器可以讓你更容易的處理有有碰撞的運動,同時不用處理剛體。(也就是說角色控制器負責處理角色的移動,如果新增角色控制器,就不用在新增剛體元件)

        角色控制器不受力的影響,並且只有當你呼叫move函式時才會移動。他的運動收碰撞的約束。

變數:

        public Vector3 center;

描述:

                角色膠囊體的中心相對於transform的位置。     

public class ExampleClass : MonoBehaviour {
    public CharacterController controller;
    void Example() {
        controller = GetComponent<CharacterController>();
        controller.center = new Vector3(0, 1, 0);
    }
}

           public CollisionFlags collisionFlags;

描述:

                 上一次呼叫CharacterController.Move後, 膠囊碰撞體的那個部位與換景發生了碰撞。(CollisionFlags是位掩碼標記,其值分別是:None。 Side--身體發生碰撞,如撞在了牆上。  Above--頭頂發生碰撞。 Below--腳底發生碰撞,如站在了地面)

public class ExampleClass : MonoBehaviour {
    void Update() {
        CharacterController controller = GetComponent<CharacterController>();
        if ((controller.collisionFlags & CollisionFlags.Above) != 0)
            print("touched the ceiling");
        
    }
}

          public bool detectCollisions;

(這個屬性不知道有什麼用。如果要忽略碰撞請使用 Physics.IgnoreCollision,把這個屬性設定為false沒用 )

       public float height;

描述:

                角色膠囊體的高度。

public class ExampleClass : MonoBehaviour {
    public CharacterController controller;
    void Example() {
        controller = GetComponent<CharacterController>();
        controller.height = 2.0F;
    }
}

          public bool isGrounded;

描述:

                判斷角色控制器在移動中是否碰到了地面。

public class ExampleClass : MonoBehaviour {
    void Update() {
        CharacterController controller = GetComponent<CharacterController>();
        if (controller.isGrounded)
            print("We are grounded");
        
    }
}

        public float radius;

描述:

               角色膠囊體的半徑。

public class ExampleClass : MonoBehaviour {
    public CharacterController controller;
    void Example() {
        controller = GetComponent<CharacterController>();
        controller.radius = 0.3F;
    }
}

          public float skinWidth;

描述:

                角色的碰撞體的外皮的寬。(也就是額外的增加這段距離可以觸發碰撞, 一般其值很小但不為0)

       public float slopeLimit;

描述:

                角色控制器能爬的最大坡度的斜坡。

public class ExampleClass : MonoBehaviour {
    public CharacterController controller;
    void Example() {
        controller = GetComponent<CharacterController>();
        controller.slopeLimit = 45.0F;
    }
}

         public float stepOffset;

描述:

               米為單位,角色控制器每一步的位移。

public class ExampleClass : MonoBehaviour {
    public CharacterController controller;
    void Example() {
        controller = GetComponent<CharacterController>();
        controller.stepOffset = 2.0F;
    }
}

       public Vector3 velocity;

描述:

               角色當前的相對速度。(只讀)

               可以讓你追蹤到角色當前行走的速度,例如角色被牆卡住時其值為零向量。

               注意:這個值與角色呼叫CharacterController.MoveCharacterController.SimpleMove 函式之後其行走的距離是不同的。這個值是相對的是因為他不能追蹤 CharacterController 之外的 tranform 的移動,比如角色在其父物體下產生的移動,例如在車裡。

public class ExampleClass : MonoBehaviour {
    void Update() {
        CharacterController controller = GetComponent<CharacterController>();
        Vector3 horizontalVelocity = controller.velocity;
        horizontalVelocity = new Vector3(controller.velocity.x, 0, controller.velocity.z);
        float horizontalSpeed = horizontalVelocity.magnitude;
        float verticalSpeed = controller.velocity.y;
        float overallSpeed = controller.velocity.magnitude;
    }
}

函式:

描述:

                   一個複合的移動函式完成一個絕對的運動。

                   根據motion移動控制器,只受碰撞體約束。collisionFlags簡述了在移動過程中發生的情況。這個函式不提供任何重力

public class ExampleClass : MonoBehaviour {
    public float speed = 6.0F;
    public float jumpSpeed = 8.0F;
    public float gravity = 20.0F;
    private Vector3 moveDirection = Vector3.zero;
    void Update() {
        CharacterController controller = GetComponent<CharacterController>();
        if (controller.isGrounded) {
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection *= speed;
            if (Input.GetButton("Jump"))
                moveDirection.y = jumpSpeed;
            
        }
        moveDirection.y -= gravity * Time.deltaTime;
        controller.Move(moveDirection * Time.deltaTime);
    }
}

          public bool SimpleMove(Vector3 speed);

描述:

                  通過speed移動角色。

                  這個函式忽略Y軸的移動。速度是以米為單位。自動新增重力。角色在地面上時返回true。

[RequireComponent(typeof(CharacterController))]
public class ExampleClass : MonoBehaviour {
    public float speed = 3.0F;
    public float rotateSpeed = 3.0F;
    void Update() {
        CharacterController controller = GetComponent<CharacterController>();
        transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0);
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        float curSpeed = speed * Input.GetAxis("Vertical");
        controller.SimpleMove(forward * curSpeed);
    }
}