📅  最后修改于: 2023-12-03 15:27:36.614000             🧑  作者: Mango
在使用多个字符控制器来控制不同的对象时,很容易出现冲突。此时,我们需要使用统一字符控制器来避免冲突。本文将介绍如何在C#中使用统一字符控制器来忽略冲突。
在Unity中,创建一个新的C#脚本,将它挂载到任何一个空物体上作为统一字符控制器。
public class CharacterController : MonoBehaviour {
[SerializeField]
private float moveSpeed = 6.0f;
[SerializeField]
private float rotateSpeed = 6.0f;
private CharacterController controller;
private Vector3 moveDirection = Vector3.zero;
private float yRotation = 0.0f;
void Awake() {
controller = GetComponent<CharacterController>();
}
void Update () {
Move ();
}
private void Move () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 direction = new Vector3(h, 0, v);
direction = transform.TransformDirection(direction);
direction *= moveSpeed;
yRotation += Input.GetAxis("Mouse X") * rotateSpeed;
transform.rotation = Quaternion.Euler(0, yRotation, 0);
moveDirection.y -= 9.81f * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
}
}
在每一个需要控制的对象上,挂载字符控制器组件,并禁用该组件的一些属性,避免与统一字符控制器冲突。
禁用的属性包括:
如图所示:
在需要控制的对象上再创建一个控制脚本,在脚本中调用统一字符控制器的函数来实现控制。
public class PlayerController : MonoBehaviour {
[SerializeField]
private float moveSpeed = 6.0f;
[SerializeField]
private float rotateSpeed = 6.0f;
private CharacterController controller;
private Vector3 moveDirection = Vector3.zero;
private float yRotation = 0.0f;
private void Awake() {
controller = GetComponent<CharacterController>();
}
private void Update () {
Move ();
}
private void Move () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 direction = new Vector3(h, 0, v);
direction = transform.TransformDirection(direction);
direction *= moveSpeed;
yRotation += Input.GetAxis("Mouse X") * rotateSpeed;
transform.rotation = Quaternion.Euler(0, yRotation, 0);
moveDirection.y -= 9.81f * Time.deltaTime;
CharacterController.Move(moveDirection * Time.deltaTime);
}
}
使用统一字符控制器可以避免字符控制器之间的冲突。通过禁用一些字符控制器的属性,以及在控制脚本中调用统一字符控制器的函数,我们可以实现多个对象的控制。