Заметки по Unity3D

Содержание:
Захотелось мне сделать двухмерную игру. Благо, в 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.

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
24
10 лет назад
0
Хардкорненько, но что-то мне подсказывает что должен быть более простой способ.
1
24
10 лет назад
1
Если имелось ввиду именно вращение а не поворот, то всё куда проще:
transform.Rotate(Vector3.forward * Time.deltaTime * 50);
Плюс не стоит забывать про Vector2, который работает в X/Y плоскостях.
Vector2 LookAtPoint = new Vector2(Target.transform.position.z, Target.transform.position.y);
transform.LookAt(new Vector3(0,LookAtPoint.y,LookAtPoint.x);
0
26
10 лет назад
Отредактирован lentinant
0
Если имелось ввиду именно вращение а не поворот, то всё куда проще:
Я же написал - поворот одного спрайта к другому. Я не настолько глуп, чтобы не разобраться самостоятельно с обычным вращением.
RSQR:
Плюс не стоит забывать про Vector2, который работает в X/Y плоскостях.
Ага, и получается все тот же поворот ребром.
Было бы все так просто - этого поста бы тут не было.
0
21
10 лет назад
0
prog, в юнити 2д прилеплен криво. Фактически, добавилась лишь система анимации для спрайтов и Box2D. Все остальное как в три дэ осталось.
0
24
10 лет назад
0
Плюс не стоит забывать про Vector2, который работает в X/Y плоскостях.
Ага, и получается все тот же поворот ребром.
Было бы все так просто - этого поста бы тут не было.
Ты вообще пытался? :о
0
26
10 лет назад
Отредактирован lentinant
0
Ты вообще пытался? :о
Нет, блин, я начал искать костыли просто так, сразу.
Я перепробовал много манипуляций со стандартными функциями. Сработала только эта. И да, я проверил твой код тоже. О повороте на ребро я писал уже после этого.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.