Перейти к содержимому

HUD на ImGui

Сделаем компактный блок, который показывает здоровье локального игрока. Для ImGui не нужны дополнительные файлы — весь пример находится в scripts/main.lua.

local function GetHealthColor(health, maximum)
local ratio = 0
if maximum > 0 then
ratio = health / maximum
end
return Color.new(1 - ratio, ratio, 0.2, 1)
end
local function DrawHud()
local agent = Agents:GetLocalAgent()
if agent == nil or agent.Health == nil then
return
end
local health = agent.Health.CurrentHealth
local maximum = agent.Health.MaxHealth
local text = "HP " .. tostring(health) .. " / " .. tostring(maximum)
ImGui:DrawText(
text,
Rect.new(24, Screen.Height - 86, 260, 46),
22,
GetHealthColor(health, maximum),
TextAnchor.MiddleLeft
)
end
Scheduler:OnFrame(DrawHud)

ImGui не создаёт постоянный элемент. Каждый вызов добавляет содержимое только в текущий кадр, поэтому DrawHud() регистрируется через Scheduler:OnFrame().

Локальный агент может быть недоступен во время загрузки, наблюдения или перехода между состояниями. Ранний return защищает модуль от обращения к отсутствующему объекту.

Rect.new(x, y, width, height) использует экранные пиксели от левого верхнего угла. В примере Y вычисляется от Screen.Height, поэтому блок остаётся у нижнего края.

Для позиции относительно viewport можно использовать DrawTextUV(), а для обычной точки — DrawTextPos().

Размер и цвет удобно отдать пользователю:

[
{
"label": "HUD size",
"key": "HudSize",
"type": "number",
"value": 22,
"min": 12,
"max": 36
}
]

После этого замените 22 в DrawText() на Config.HudSize.

Справочник: ImGui, Scheduler, Agent, Screen, Rect, Color и Config.