YourDesire
@YourDesire
Я вообще по образованию бухгалтер...

Как готовить координаты в Unity 2D?

Я никогда раньше с вещами типа Unity не игрался. Возможно вопрос очень глупый.

Здравствуйте.
Никак не могу понять, как же употреблять координаты в Unity 2D (Orthographic Camera).
Создал пустой 2D проект, сцену, скрипт.
Хочу программно нарисовать объект в левом верхнем углу. Ок. Создал префаб (prefab) на основе спрайта и пишу опираясь на официальное руководство:
void Start () {
    Instantiate(star, new Vector3(0, 0, 0), Quaternion.identity);
}


Вопреки ожиданиям увидеть спрайт в левом верхнем углу, я его наблюдаю по центру экрана... Нууу... Ок.
Идем дальше.
Если я добавлю еще один спрайт и задам ему значение для y равным 1
void Start () {
    Instantiate(star, new Vector3(0, 0, 0), Quaternion.identity);
    Instantiate(star, new Vector3(0, 1, 0), Quaternion.identity);
}

То вполне себе буду желать увидеть его правее от первого спрайта на 1 пиксель.
Но... Нет.
Он будет левее не на 1 пиксель, а на 1 клетку.
Далее я узнал, что высота и ширина камеры измеряются в этих самых "клетках". Нуууу. Ок.

Итак, снова: я хочу нарисовать спрайт в левом верхнем углу экрана.
Камера измеряется в "клетках".... Значит что... Нужно получить размер камеры...
Согласно документации, размер камеры - единственное число:
Camera.main.orthographicSize
Ок. В высоту оно у меня, допустим 8. Camera.main.orthographicSize хранит в себе эту самую 8-ку.
А что с шириной? Где ее достать? Не могу найти... Она меняется в зависимости от высоты, если я ее меняю в редакторе.

Видимо не туда копаю? Нууу.. Допустим. Погуглив, нахожу такой вариант:

Instantiate(star, Camera.main.ScreenToWorldPoint(new Vector3(real_x, real_y, 1)), Quaternion.identity);


Более походит на правду... Правда начало координат сместилось в левый нижний угол, а не в верхний, как я ожидал...

В общем... Подскажите пожалуйста, в ту ли степь я копаю и как работают с координатами в Unity 2D?
В итоге хочу сделать игрушку по типу "3 в ряд", где поле с ячейками находится ближе к левому краю экрана.

Спасибо
  • Вопрос задан
  • 3274 просмотра
Решения вопроса 1
@Espleth
1) Есть куча туториалов для Unity, где все подробно расписано, стоит немного погуглить, или даже просто зайти на офф сайт, туториалы там неплохие. Начать настоятельно рекомендую с этого, а не сразу в код. Например вот или вот вам подойдет.
2) Это не WinForms, в Unity есть такое понятие, как сцена. Это не то, что рендерит камера: камеру можно двигать как угодно, объекты на сцене своего местоположения не меняют. И по умолчанию камера у вас смотрит на центр сцены, то есть в центре камеры координаты (0;0;0). И от пикселей все абстрагируется, на сколько пикселей сдвинется у вас объект решает движок в зависимости от разрешения экрана и настроек камеры.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ArXen42
@ArXen42
Если нужна привязка спрайтов к краям экрана, то, возможно, стоит воспользоваться системой UI. Ну там добавить Canvas, на него закинуть UI спрайт, у спрайта можно выбрать привязку к краям экрана, pivot и т.д. и т.п.

Если UI вот совсем не то, что нужно, тогда, видимо, стоит копать в связь экранных координат (пикселей тобишь) с мировыми. Какой-нибудь cameraToWorldMatrix может быть.

С другой стороны, не так давно на структурно похожем Urho3D без особых проблем сделал что-то похожее без всяких матриц. Там OrthographicSize являлся вертикальным размером камеры в игровых координатах (здесь, наверное, тоже). Из AspectRatio получал соответственно и ширину. Ну а зная координаты и размеры камеры расположить все как надо уже несложно.
Там я еще использовал тот факт, что измерения 2D спрайта в игровом пространстве были ровно в 100 раз меньше пиксельных, в Unity3d не приходилось вникать, но вроде как reference pixels per unit как раз про это.

Но это все для очень специфичных случаев.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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