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;
}
}
函数:
public CollisionFlags Move(Vector3 motion);
描述:
一个复合的移动函数完成一个绝对的运动。
根据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);
}
}