Как записать направление агентов ИИ НавМеш - PullRequest
1 голос
/ 20 мая 2019

Мне интересно узнать, как я могу определить направление, в котором идет агент Navmesh, с этими значениями я планировал привязать их к Blendtree, где будут воспроизводиться определенные анимации в зависимости от направления AI, используя форму 2D FreeДекартова плоскость. Я планировал использовать эти ссылочные значения направлений для воспроизведения определенных анимаций, причем направления X и Z начинались с нуля.поэтому, чтобы идти вперед, значение Z будет равно 1, тогда как значение X будет 0

. В настоящее время я уже пытался использовать скорость твердого тела и transform.forward (X и Z), в то время как я не получил значений, использующих скоростьtransform.forward действительно дает увеличивающиеся значения, однако это не похоже на значения, которые я искал (эти значения должны находиться в диапазоне от 0 до 1), а также никогда не имел начальной позиции (Idle) 0,0

void animationUpdate() {
        anim.SetFloat("Enemy Z", /* Unsure what to do*/);
        anim.SetFloat("Enemy X", /* Unsure what to do*/);

        if (/*transform.forward.x != 0 && transform.forward.z != 0*/) {
            anim.SetBool("isWalking", true);
        } else {
            anim.SetBool("isWalking", false);
        }
    }

Моя декартова плоскость выглядит следующим образом Cartesian Plane

Буду признателен за любую помощь, спасибо за чтение

1 Ответ

2 голосов
/ 21 мая 2019

Вы можете использовать desiredVelocity, чтобы найти, в каком направлении он движется, а затем Vector3.Project, чтобы разложить его на то, как он движется вперед / вправо.

Vector3 normalizedMovement = nav.desiredVelocity.normalized;

Vector3 forwardVector = Vector3.Project(normalizedMovement, transform.forward);

Vector3 rightVector = Vector3.Project (normalizedMovement, transform.right);

Получите величину (которая, потому что мы проецировалинормализованное движение, будет плавать между -1 и 1) и использовать Vector3.Dot, чтобы определить знак величины в каждом компоненте:

// Dot(direction1, direction2) = 1 if they are in the same direction, -1 if they are opposite

float forwardVelocity = forwardVector.magnitude * Vector3.Dot(forwardVector, transform.forward);

float rightVelocity = rightVector.magnitude * Vector3.Dot(rightVector, transform.right);

Теперь вы можете назначить их для вашей анимации, преобразовавдиапазон от [-1,1] до [0,1] с использованием Mathf.InverseLerp:

anim.SetFloat("Enemy Z", Mathf.InverseLerp(-1f, 1f, forwardVelocity));
anim.SetFloat("Enemy X", Mathf.InverseLerp(-1f, 1f, rightVelocity));
...