Уменьшить входную чувствительность в единицу - PullRequest
0 голосов
/ 01 мая 2019

Я сделал изометрический контроллер персонажей, чтобы он мог двигаться и двигаться в изометрической перспективе. Проблема заключается в том, что когда я пытаюсь двигаться, используя 2 клавиши (W + D, A + S ...) и отпускаю эти клавиши, игрок склонен сталкиваться с самой последней выпущенной клавишей, поэтому сложно провести диагональ направление. Это заставляет персонажа поворачивать свое вращение в самый последний момент, когда клавиши отпущены.

Я думал об использовании своего рода проверки сна или сопрограммы, если две клавиши были нажаты и отпущены за короткий промежуток времени, просто не поворачивая их.

Существует ли не слишком простое решение для этого?

Вот мой код (я только что скопировал его отсюда: https://www.studica.com/blog/isometric-camera-unity)

    private void SetIsometricDirections() {
        vertical = Camera.main.transform.forward;
        vertical.y = 0;
        vertical = Vector3.Normalize(vertical);
        horizontal = Quaternion.Euler(new Vector3(0, 90, 0)) * vertical;
    }

    private void Move() {
        Vector3 horizontalMovement = horizontal * moveSpeed * Time.deltaTime * Input.GetAxis("HorizontalKey");
        Vector3 verticalMovement = vertical * moveSpeed * Time.deltaTime * Input.GetAxis("VerticalKey");
        Vector3 heading = Vector3.Normalize(horizontalMovement + verticalMovement);
        Heading(heading);
        transform.position += (horizontalMovement + verticalMovement);
    }

    private void Heading(Vector3 heading) {
        transform.forward = heading;
    }

Трюк с заголовком, очевидно, в методе "Заголовок".

1 Ответ

0 голосов
/ 07 мая 2019

Я наконец нашел решение. Я опубликую это на всякий случай, если кому-то еще это понадобится в будущем.

Я рассчитываю текущее вращение на основе движения.

private void SetRotation() {
    currentRotation = Quaternion.LookRotation(movement);
}

Затем я создал второй кватернион для хранения последнего вращения, если оно не совпадает с текущим. Я также использую счетчик для хранения времени, в течение которого произошел поворот, до остановки движения или изменения направления.

private void CheckSameRotation() {
    if (lastRotation != currentRotation || movement == Vector3.zero) {
            sameRotationTime = 0;
            lastRotation = currentRotation;
    }
    else {
        sameRotationTime += Time.deltaTime;
    }
}

Затем я использовал bool, чтобы проверить, достаточно ли времени, чтобы произошло вращение.

private void TimeAtSameRotation() {
    canRotate = (sameRotationTime < 0.015f) ? false : true;
}

И затем я, наконец, поворачиваю объект, если движение не равно нулю и условие «canRotate» выполняется.

private void Rotate() {
    if (movement != Vector3.zero && canRotate) {
        transform.rotation = currentRotation;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...