Как правильно использовать CharacterController.Move () для перемещения персонажа - PullRequest
0 голосов
/ 23 мая 2018

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

Как я могу добавить moveDirectionForward и moveDirectionSide в 1 Vector3, чтобы иметь возможность использоватьCharacterController.Move() вместо CharacterController.SimpleMove()?

void MovePlayer() {

    // Get Horizontal and Vertical Input
    float horizontalInput = Input.GetAxis ("Horizontal");
    float verticalInput = Input.GetAxis ("Vertical");

    // Calculate the Direction to Move based on the tranform of the Player
    Vector3 moveDirectionForward = transform.forward * verticalInput * walkSpeed * Time.deltaTime;
    Vector3 moveDirectionSide = transform.right * horizontalInput * walkSpeed * Time.deltaTime;

    // Apply Movement to Player
    myCharacterController.SimpleMove (moveDirectionForward + moveDirectionSide);

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы захотите использовать нормализованный вектор двух осей при умножении на walkSpeed.Причина в том, что это гарантирует, что вы всегда будете двигаться в любом направлении с одинаковой величиной (1) независимо от угла.Принимая во внимание, что ваша текущая установка имеет неортогональное движение, рассчитываемое при> 1 величине.Так что-то вроде этого должно работать в вашей ситуации.

void MovePlayer()
{

    // Get Horizontal and Vertical Input
    float horizontalInput = Input.GetAxis("Horizontal");
    float verticalInput = Input.GetAxis("Vertical");

    // Calculate the Direction to Move based on the tranform of the Player
    Vector3 moveDirectionForward = transform.forward * verticalInput * Time.deltaTime;
    Vector3 moveDirectionSide = transform.right * horizontalInput * Time.deltaTime;

    // Apply Movement to Player
    myCharacterController.SimpleMove((moveDirectionForward + moveDirectionSide).normalized * walkspeed);

Просто переместите умножение walkSpeed ​​в вызов SimpleMove для нормализованного вектора.Изображение ниже должно помочь визуализировать проблему, с которой вы столкнулись.Нормализуя вектор перед применением скорости ходьбы, вы убедитесь, что вектор направления имеет одинаковую величину (в данном случае, фактически, расстояние), независимо от того, в каком направлении вы применяете скорость ходьбы.

enter image description here

0 голосов
/ 23 мая 2018

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

// Get Horizontal and Vertical Input
float horizontalInput = Input.GetAxis ("Horizontal");
float verticalInput = Input.GetAxis ("Vertical");

// Calculate the Direction to Move based on the tranform of the Player
Vector3 moveDirectionForward = transform.forward * verticalInput;
Vector3 moveDirectionSide = transform.right * horizontalInput;

//find the direction
Vector3 direction = (moveDirectionForward + moveDirectionSide).normalized;
//find the distance
Vector3 distance = direction * walkSpeed * Time.deltaTime;

// Apply Movement to Player
myCharacterController.Move (distance);

Примечание по производительности:

vector.normalized получено из vector/vector.magnitude и vector.magnitude получается из sqrt(vector.sqrMagnitude), который тяжело обрабатывать.Чтобы уменьшить вес обработки, вы можете использовать vector/vector.sqrMagnitude вместо vector.normalized, но учтите, что результат не совсем тот же, но все же в том же направлении.


теперь мне просто нужно применить гравитацию

Вычтите moveDirection.y на гравитацию, умноженную на Time.deltaTime.Вы также можете упростить и уменьшить код в функции MovePlayer, используя Vector3 и TransformDirection.

public float walkSpeed = 10.0f;
private Vector3 moveDirection = Vector3.zero;
public float gravity = 20.0F;
CharacterController myCharacterController = null;

void Start()
{
    myCharacterController = GetComponent<CharacterController>();
}

void MovePlayer()
{
    moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
    moveDirection = transform.TransformDirection(moveDirection);
    moveDirection *= walkSpeed;

    moveDirection.y -= gravity * Time.deltaTime;
    myCharacterController.Move(moveDirection * Time.deltaTime);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...