Сохраняйте скорость игрока на склонах с помощью контроллера персонажей - PullRequest
0 голосов
/ 14 мая 2019

Я использую Unity's Character Controller для перемещения моего персонажа.

Я использую свое собственное движение, гравитацию и т. Д., Но, похоже, это не влияет непосредственно на движение. Я проверил весь свой код и сократил его до минимума просто для поиска проблемы.

Я напечатал скорость, движение, величины ... Все показывает, что движение точно такое же, как на плоской поверхности или на склонах.

Я не знаю, как работает скрипт Контроллера персонажей, поэтому такое поведение может вызывать некое вычисление.

Вот как я вычисляю свое движение:

private void SetMovement() {
    horizontalMovement = isometricHorizontal * Input.GetAxisRaw(horizontalButton);
    verticalMovement = isometricVertical * Input.GetAxisRaw(verticalButton);
    movement = (horizontalMovement + verticalMovement).normalized;
    MovementModifier();
}

private void MovementModifier() {
    if (isSprinting) {
        movement.x *= sprintFactor;
        movement.z *= sprintFactor;
    }
}

private void Move() {
    if (movement != Vector3.zero)
        characterController.Move(movement * Time.deltaTime * moveSpeed);
}

Скорость спуска увеличивается по крайней мере на 30% и уменьшается почти так же, когда поднимается.

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

EDIT:

Вот так я применяю гравитацию.

private void ApplyGravity() {
    if (!characterController.isGrounded) {
        gravity += Physics.gravity * Time.deltaTime * gravityFactor;
        if (gravity.y > 0 && !Input.GetButton(jumpButton) && !isFalling)
            gravity += Physics.gravity * Time.deltaTime * gravityFactor * (lowJumpMultiplier - 1);
    }
    else if (!isJumping) gravity = Vector3.down;
    CheckCollisionFlags();
    movement += gravity;
}

private void CheckCollisionFlags() {
    switch (characterController.collisionFlags) {
        case UnityEngine.CollisionFlags.Above:
            gravity = Vector3.down;
            break;  
    }
}

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Не видя, как вы реализуете гравитацию, я не могу быть уверен на 100%, но я бы предположил, что что-то подобное происходит (, рассматривая это, как если бы вы делали 2D боковой скроллер ):

У вашего персонажа будет горизонтальное движение, и если это нормализуется, вы получите постоянную горизонтальную скорость.

Однако, когда вы применяете гравитацию, вы ускоряетесь по вертикали, вызывая увеличение скорости вниз.

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


Чтобы обойти это, вам, вероятно, нужно сделать что-то вроде этого:

Проверьте, заземлены ли вы, если вы движетесь по плоской поверхности или по склону, и вам следует нормализовать свою скорость после добавления вертикального движения, вызванного гравитацией.

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

Я только что обнаружил, что мне пришлось увеличить свойство Step Offset для CharacterController. Похоже, что это приводило к некоторому конфликту при подъеме по склонам или лестнице и удержании движения.

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

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