Arios
@Arios

Как узнать коллениарны ли вектора?

Есть стик, который задает направление персонажа. Персонаж поворачивается в эту сторону не сразу, а через какое-то время. Также персонаж при повороте начинает стрелять, но пробелма в том, что он не должен стрелять пока не будет смотреть в ту же сторону на которую показывает стик. Неужели нужно по отдельности сравнивать каждую координату через mathf.Approximately?
  • Вопрос задан
  • 692 просмотра
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Если интересует конкретно коллинеарность, то она проверяется следующим образом:
public const float Epsilon = 0.00001f;

public static bool AreCollinear(Vector2 a, Vector2 b)
{
    return Mathf.Abs(PerpDot(a, b)) < Epsilon;
}

public static float PerpDot(Vector2 a, Vector2 b)
{
    return a.x*b.y - a.y*b.x;
}

Учтите только, что сонаправленность вы так не проверите, для этого лучше использовать Vector2.Dot. И не забудьте нормализовать вектора, иначе получите не то, что ожидаете.
public const float Epsilon = 0.00001f;

public static bool AreCodirected(Vector2 a, Vector2 b)
{
    return Vector2.Dot(a, b) > 1 - Epsilon;
}

Если же говорить про конкретно ваш случай, то лучше использовать Vector2.Angle или Quaternion.Angle. Просто считаете угол и стреляете, если он попадает в определённый диапазон.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы