avatar

[Unity4] Имена игровых персонажей над головой

опубликовал в Unity3D
Определимся с целями:
  1. Создать имя над головой игрока
  2. Привязать к игроку в мировых координатах
Начнем с простого, объявим переменные… Подождите… Давайте приступим к первому шагу!

Шаг первый.

Объявим переменную с позиционированием имени над головой игрока, то есть сделаем отступ, а также зададим само имя:
public float nameplankahgt = 1f;
public string npc_name = "Игрок";

Выполнено. Теперь в шаге два, мы разберем функцию OnGUI ().

Шаг второй.

Сначала создаем вспомогательную переменную Vector3 с расчетом позиции, для моделирования пространственного вектора, который поможет определить позиции игрока X, Y, Z.
Vector3 pos = new Vector3 (transform.position.x, transform.position.y + nameplankahgt, transform.position.z);

Теперь давайте преобразуем координаты выше через новый Vector3 при помощи WorldToScreenPoint в мировую координату:
Vector3 crd = Camera.main.WorldToScreenPoint (pos);

Расчетом позиции по y займемся сейчас. В расчете вы отнимем из Screen.height координаты crd.y:
crd.y = Screen.height - crd.y;

Ну основное из расчетов мы сделали, теперь давайте примем новый стиль нашего текста, в котором укажем цвет, размер и выравнивание:
GUIStyle style = new GUIStyle ();
style.fontSize = 12;
style.normal.textColor = Color.red;
style.alignment = TextAnchor.MiddleCenter;

Теперь одно из самого простого, а также и самого сложного — создание текста. Что тут сложного? Ничего, кроме позиционирования элемента сложного нет. Я просто запутался когда писал:
GUI.Label (new Rect (crd.x - 120, crd.y, 240, 18), npc_name, style);

Спасибо за внимание, с вами был Максим Епихин!

16 комментариев

avatar
Давай скриншот, чтобы было видно, как это будет выглядеть.
avatar
Надо бы побольше разъяснений.
В расчете вы отнимем из Screen.height координаты crd.y:
Зачем?
GUI.Label (new Rect (crd.x - 120, crd.y, 240, 18), npc_name, style);
Что за магические числа?
avatar
(crd.x - 120, crd.y, 240, 18), npc_name, style

X позиция, Y позиция, ширина, высота, то что будет отображаться в строке, стиль.
avatar
Почему -120, почему 240? Что за 18?
avatar
240 и 18 — ширина и высота соответственно, а -120 — это отнятие от позиции по x 120 пикселей
avatar
Зачем отнятие? Для чего? Почему именно 120? Почему бы это не вынести как константы?
avatar
Зачем в константы? Такого бреда я ещё не слышал.
avatar
Либо ты троллишь, либо у меня для тебя плохие новости :)
avatar
Либо ты несёшь бред.
avatar
Стойте, давайте успокоимся! Почему 10? Потому что для выравнивания я подобрал именно 120. Можно и другую цифру, все зависит от выравнивания! Проще говоря 120 — цифра смещения, подобранная мной
avatar
Я думаю было бы вполне уместно написать где-то в начале кода
const int offset = 120; // Смещение надписи по оси Х
Тогда бы читаемость кода возросла, плюс потом не пришлось бы думать, что это и зачем.
avatar
Ну это базовый уровень программирования. Это обязаны все знать программисты.
avatar
Программисты не должны знать, почему вы решили в данном случае взять именно 120. И тем более, вы же урок пишите. Посмотрите уроки от NeHe — у него каждая строка идёт с комментарием, а их там больше тысячи :)
avatar
Программисты должны базу знать, а тут база такова: из координаты X отнимаем число, чтобы сместить объект.
avatar
Есть только одна проблема: если смотреть в противоположную от NPC сторону, то ты видишь его имя на экране там, где его нет
Чтобы оставить комментарий необходимо .