Unity-CharacterController(角色控制器)

描述:

角色控制器可以让你更容易的处理有有碰撞的运动,同时不用处理刚体。(也就是说角色控制器负责处理角色的移动,如果添加角色控制器,就不用在添加刚体组件)

角色控制器不受力的影响,并且只有当你调用move函数时才会移动。他的运动收碰撞的约束。

变量:

public Vector3 center;

描述:
角色胶囊体的中心相对于transform的位置。

1
2
3
4
5
6
7
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–脚底发生碰撞,如站在了地面)

1
2
3
4
5
6
7
8
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;

描述:
角色胶囊体的高度。

1
2
3
4
5
6
7
public class ExampleClass : MonoBehaviour {
public CharacterController controller;
void Example() {
controller = GetComponent<CharacterController>();
controller.height = 2.0F;
}
}

public bool isGrounded;

描述:
判断角色控制器在移动中是否碰到了地面。

1
2
3
4
5
6
7
8
public class ExampleClass : MonoBehaviour {
void Update() {
CharacterController controller = GetComponent<CharacterController>();
if (controller.isGrounded)
print("We are grounded");

}
}

public float radius;

描述:
角色胶囊体的半径。

1
2
3
4
5
6
7
public class ExampleClass : MonoBehaviour {
public CharacterController controller;
void Example() {
controller = GetComponent<CharacterController>();
controller.radius = 0.3F;
}
}

public float skinWidth;

描述:
角色的碰撞体的外皮的宽。(也就是额外的增加这段距离可以触发碰撞, 一般其值很小但不为0)

public float slopeLimit;

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

1
2
3
4
5
6
7
public class ExampleClass : MonoBehaviour {
public CharacterController controller;
void Example() {
controller = GetComponent<CharacterController>();
controller.slopeLimit = 45.0F;
}
}

public float stepOffset;

描述:
米为单位,角色控制器每一步的位移。

1
2
3
4
5
6
7
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 的移动,比如角色在其父物体下产生的移动,例如在车里。

1
2
3
4
5
6
7
8
9
10
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简述了在移动过程中发生的情况。这个函数不提供任何重力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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。

1
2
3
4
5
6
7
8
9
10
11
12
[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);
}
}