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.Move 和 CharacterController.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);
}
}