Найти угол поворота в 2d по вектору направления к цели в 3d. Unity
В сцене unity есть объект target, на него указывает пустышка при помощи transform.LookAt(target), эта пустышка прикреплена к камере и двигается вместе с ней. Таким образом у пустышки вектор transform.forward всегда указывает на target. Мне нужно сделать указатель в 2d по этому вектору. Я сверстал простой ui, где жёлтый квадрат является указателем, вращается он по кругу при помощи оси z объекта area. 
При помощи следующего кода этот указатель работает отлично, но только пока target.position.x и y равны нулю, как только они меньше или больше, то код перестаёт работать. Не могу понять, что мне нужно учесть, чтобы указатель работал всегда...
transform.LookAt(target);//это transform пустышки прикрепленной к камере
var forward = transform.forward;
var angle = Vector2.SignedAngle(Vector2.up, new Vector2(forward.x, forward.y));
area.localRotation = Quaternion.AngleAxis(angle, Vector3.forward);//это RectTransform объекта area
UPD: вот эта строчка решила вышеописанную проблему forward -= target.position.normalized; Но, к сожалению, этот алгоритм не даёт корректного результата при любом вращении камеры, он точно работает когда camera.transform.up направлен вверх по оси Y. В других случаях появляются некорректные значения.
UPD: Решено! Всё оказалось куда проще, нужно было перевести позицию target в пространство экрана и дальше работать с ней как с обычным вектором в 3D, учитывая, что ось z это глубина и её в принципе можно отбросить.
var targetPos = сamera.WorldToScreenPoint(target.position);
var dir = (targetPos - area.position).normalized;
var angle = Vector2.SignedAngle(Vector2.up, new Vector2(dir.x, dir.y));
area.localRotation = Quaternion.AngleAxis(angle, Vector3.forward);
Ответы (1 шт):
Решено! Всё оказалось куда проще, нужно было перевести позицию target в пространство экрана и дальше работать с ней как с обычным вектором в 3D, учитывая, что ось z это глубина и её в принципе можно отбросить.
var targetPos = сamera.WorldToScreenPoint(target.position);
var dir = (targetPos - area.position).normalized;
var angle = Vector2.SignedAngle(Vector2.up, new Vector2(dir.x, dir.y));
area.localRotation = Quaternion.AngleAxis(angle, Vector3.forward);