Как определить, движется ли игрок влево / вправо / назад / вперед - PullRequest
0 голосов
/ 24 февраля 2020

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

Я пытался обнаружить это, когда пользователи нажимают клавиши со стрелками, а затем проверяют, отличается ли текущая позиция игрока вдоль плоскостей X или Y (преобразование z) по сравнению с тем, что было раньше. Это не похоже на работу.

Я также пытался использовать этот код из ответов Unity, где был задан похожий вопрос, но он не работает для меня:

 float dot = Vector3.Dot(transform.forward, Vector3.forward);
 if(dot > 0.9) // going forward direction
 else if (dot < - 0.9) // going opposite to forward direction
 else{
      Vector3 cross = Vector3.Cross(transform.forward, Vector3.forward);
      // This could be the other way around...never remember which order
      if(cross.y < 0) // going right 
      else // going left 
 }

1 Ответ

0 голосов
/ 24 февраля 2020

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

Скорость

Так же, как я Сказав, что когда ваш персонаж движется с физикой, вы можете проверить направление следующим образом:

public RigidBody rb; // Add the rigidbody of your Player to your script

void Update() {
    // What ever your code is here
    Vector3 vel = transform.rotation * rb.velocity;
    if(vel.z > 0) {
        // forward
    } else if(vel.z < 0) {
        // backwards
    }
    if(vel.x > 0) {
        // right
    } else if(vel.x < 0) {
        // left
    }
}

Позиция

Вы также можете проверить движение по позиции. Для этого вам нужно сравнить не только старый Pos и ​​новый Pos, но также старый Rotation и новый Rotation. Я мог бы подумать: (не проверено)

Vector3 oldPos;
Quaternion oldRot;

Update() {
    Vector3 movement = oldRot * (transform.position - oldPos));
    if(movement.z > 0) {
        // forward
    } else if(movement.z < 0) {
        // backwards
    }
    if(movement.x > 0) {
        // right
    } else if(movement.x < 0) {
        // left
    }
    oldPos = transform.position;
    oldRot = transform.rotation;
}

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