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

世界空间 UI

使用世界空间 UI 在玩家头顶上方显示文字,以及任何其他应感觉像是游戏世界一部分的文本。

世界空间 UI 绘制在 2D 世界中,而不是屏幕上。可用于姓名牌、生命条、标牌,以及任何应感觉固定在游戏对象上的文本。

世界空间 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 值和间距。

最后更新于