For the complete documentation index, see llms.txt. This page is also available as Markdown.

UI в мировом пространстве

Используйте UI в мировом пространстве, чтобы отображать текст над головами игроков и любой другой текст, который должен ощущаться как часть самого игрового мира.

UI в мировом пространстве рисуется в 2D-мире, а не на экране. Используйте его для табличек с именами, полосок здоровья, знаков и любого текста, который должен ощущаться прикреплённым к игровым объектам.

UI в мировом пространстве использует метры для размеров. Если вы используете размеры в экранных пунктах, ваш UI будет огромным.

Основные правила

  • Рисуйте UI игрока в мировом пространстве из ao_late_update этого игрока в is_local_or_server().

  • Для UI, привязанного к движущейся сущности, вызывайте UI.begin_world_space_ui(entity) и defer UI.end_world_space_ui() чтобы интерполяция рендера следовала за этой сущностью.

  • Используйте UI.push_world_draw_context() только для не привязанного к объектам рисования в мире.

  • Используйте метры для размеров и смещений прямоугольников.

  • Сдвигайте Z для правильной сортировки по глубине (обычно используйте pos.y).

  • Используйте подпрямоугольник только для заполнения по проценту (например, полосок здоровья).

Примеры

Отображение уровня игрока

draw_player_level :: proc(player: Player) {
    UI.begin_world_space_ui(player.entity);
    defer UI.end_world_space_ui();

    pos := player.entity.world_position;
    UI.push_z(pos.y);
    defer UI.pop_z();

    ts := UI.default_text_settings();
    ts.size = 0.30; // Размер текста в мировом пространстве
    ts.halign = .CENTER;
    ts.valign = .CENTER;

    text_pos := pos + v2{0, 1.7};
    rect := Rect{text_pos, text_pos}.grow(0.05, 0.4, 0.05, 0.4);
    UI.text(rect, ts, "Lvl %", {player.level});
}

Знаки базы игрока

Полоски здоровья

Индикаторы прогресса

World_Progress_Bar предоставляет стандартную полосу в мировом пространстве:

Приведения типов сохраняют деление в вещественных числах, а ограничение знаменателя предотвращает деление на ноль.

Для пользовательской полосы, заполнение которой меняется со временем, храните один Float_Interpolation_Helper на каждую полосу:

Стрелки туториала

Перегрузка для сущности включает смещение интерполяции цели:

Для принадлежащей скрипту позиции, которая движется, храните Position_Interpolation_Helper и передавайте её смещение:

После перемещения сущности в новую позицию вызовите entity.mark_teleported() чтобы интерполяция не размазывалась между старой и новой позициями.

Преобразование координат

Советы

  • Держите мировой UI минимальным и читаемым на расстоянии. Если у вас есть камера с масштабированием, не забудьте уменьшать размер текста при отдалении.

  • Используйте fit_aspect(texture.get_aspect()) если вы рисуете иконки в мировом пространстве.

  • Если текст мерцает или накладывается друг на друга, проверьте значения Z и интервалы.

Последнее обновление