【问题标题】:CharacterController collision issueCharacterController 碰撞问题
【发布时间】:2020-12-21 17:26:17
【问题描述】:

我在游戏中增加了蹲伏的能力。我这样做的方法是更改​​控制器高度和中心 y 值。问题是当我蹲下走到平台下方时,即使有足够的空间,玩家仍然会与平台发生碰撞。

如果我将控制器高度设置为蹲伏高度作为默认高度,玩家可以毫无问题地进入平台下方。虽然,如果我使用中心偏移,则会发生碰撞问题。

bool isCrouching; float defaultHeight; Vector3 localCameraPos;

private CharacterController controller = null;
private Camera camera;

void Start()
{
    controller = GetComponent<CharacterController>();
    camera = camera.main;
    localCameraPos = camera.transform.localPosition;
    defaultHeight = controller.height;
}
void Update()
{
    isCrouching = Input.GetKey(KeyCode.C);
}
void FixedUpdate()
{
    DoCrouch();
}
void DoCrouch()
{
    var height = isCrouching ? defaultHeight / 2 : defaultHeight;

    controller.height = Mathf.Lerp(controller.height, height, 5 * Time.deltaTime);
    controller.center = Vector3.down * (defaultHeight - controller.height) / 2.0f;

    var camPos = new Vector3(0, camera.transform.localPosition.y, 0);
    camPos.y = Mathf.Lerp(camPos.y, localCameraPos.y - (defaultHeight - controller.height), 5 * Time.deltaTime);

    camera.transform.localPosition = camPos + localCameraPos;
}

玩家通过调用 CharacterController.move() 函数移动。

void FixedUpdate()
{
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");

    isWalking = !Input.GetKey(KeyCode.LeftShift);

    Vector2 _inputVector = new Vector2(horizontal, vertical);

    if (_inputVector.sqrMagnitude > 1) { _inputVector.Normalize(); }

    Vector3 desireMoveDir = transform.right * _inputVector.x;
    desireMoveDir += transform.forward * _inputVector.y;

    if (Physics.SphereCast(transform.position, controller.radius, Vector3.down, out RaycastHit hit, controller.height / 2f, 1))
    {
        desireMoveDir = Vector3.ProjectOnPlane(desireMoveDir, hit.normal).normalized;
    }

    moveDirection = desireMoveDir * MoveSpeed;

    controller.Move(moveDirection * Time.fixedDeltaTime);
}

我该如何解决这个问题?谢谢

【问题讨论】:

  • 你可以访问碰撞器并缩放它吗?
  • 我不认为改变比例是个好主意。我需要在控制器的底部有一个枢轴,所以需要添加一个空的游戏对象并有一个控制器作为一个孩子,并且考虑到我通过调用 CharacterController.Move() 来移动玩家,这是行不通的,因为孩子会自己移动。并且没有父级并且仅缩放控制器会导致抖动,这就是为什么我在更改高度时使用中心偏移。更改比例也会弄乱子对象,例如手电筒,它是控制器的子对象。

标签: c# unity3d controller collision-detection game-physics


【解决方案1】:

刚刚解决了这个问题。我将 步距偏移 设置为 0.7。将其更改为0,解决了问题。只花了我两天时间......很好

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 2013-12-18
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多