📜  统一字符控制器忽略冲突 - C# (1)

📅  最后修改于: 2023-12-03 15:27:36.614000             🧑  作者: Mango

统一字符控制器忽略冲突 - C#

简介

在使用多个字符控制器来控制不同的对象时,很容易出现冲突。此时,我们需要使用统一字符控制器来避免冲突。本文将介绍如何在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);
    }

}
第二步:修改字符控制器的属性

在每一个需要控制的对象上,挂载字符控制器组件,并禁用该组件的一些属性,避免与统一字符控制器冲突。

禁用的属性包括:

  • 禁用CharacterController的“移动时到下面检测碰撞”
  • 禁用CharacterController的“坡度限制的最大斜率角度”
  • 禁用CharacterController的“开始时自动计算垂直方向速度”,设置为0。

如图所示:

禁用字符控制器

第三步:在脚本中使用

在需要控制的对象上再创建一个控制脚本,在脚本中调用统一字符控制器的函数来实现控制。

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);
    }
}
总结

使用统一字符控制器可以避免字符控制器之间的冲突。通过禁用一些字符控制器的属性,以及在控制脚本中调用统一字符控制器的函数,我们可以实现多个对象的控制。