Захотелось мне сделать двухмерную игру. Благо, в Unity3D недавно появился соответствующий инструментарий. Однако, когда я дошел до момента, когда мне нужно было просто повернуть спрайт к какой-то позиции, я жутко разочаровался - все функции, принимающие в качестве параметров местоположение, и возвращающие соответствующее вращение (Quaternion.LookRotation, Quaternion.FromToRotation, Transform.LookAt), ориентированы исключительно на трехмерное пространство, а в трехмерном пространстве, если один объект повернут ко второму, это значит, что его вектор forward (вектор, представляющий ось Z локальной системы координат объекта) "смотрит" на цель.
В двухмерной же игре этот вектор как раз должен выступать осью вращения. Получается, если вы поворачиваете один спрайт к другому стандартными методами, то он "стает на ребро", в результате чего его в принципе не видно. Поэтому, нужен другой подход.
После нескольких часов шаманства, я наконец-то нашел подходящее решение. Код следующий
Vector3 moveDirection = player.position - transform.position;
if (moveDirection != Vector3.zero)
{
float angle = Mathf.Atan2(-moveDirection.x, moveDirection.y) * Mathf.Rad2Deg;
transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
}
Тут player - Transform объекта, к которому нужно повернуться. Обратите внимание, что перед moveDirection.x стоит минус. Если бы его не было, объект поворачивался бы к цели осью X, а так он поворачивается осью Y.
Ред. lentinant
RSQR:
Было бы все так просто - этого поста бы тут не было.
Ред. lentinant
Я перепробовал много манипуляций со стандартными функциями. Сработала только эта. И да, я проверил твой код тоже. О повороте на ребро я писал уже после этого.