Razorbill
Scripting API

UI

Creating UI

create_ui_canvas

Create a screen-space UI canvas at runtime.

EntityHandle create_ui_canvas(ScriptContext* ctx, const char* name, int sort_order);
ParameterTypeDescription
nameconst char*Canvas entity name
sort_orderintRender order (higher = on top)

Returns the canvas entity handle, or NULL_ENTITY_HANDLE on failure.

create_ui_element

Create a UI element as a child of a canvas or another UI element.

EntityHandle create_ui_element(ScriptContext* ctx, EntityHandle parent,
                               const char* name, const char* element_type);
ParameterTypeDescription
parentEntityHandleCanvas or UI element handle
nameconst char*Element entity name
element_typeconst char*Type string (see below)

Element types: "UIText", "UIButton", "UISlider", "UIToggle", "UIProgressBar", "UIPanel", "UIImage"

destroy_ui_element

Remove a UI element from the hierarchy.

bool destroy_ui_element(ScriptContext* ctx, EntityHandle element);

Text

get_ui_text

const char* get_ui_text(ScriptContext* ctx, EntityHandle element);

Returns the text content (thread-local buffer, valid until next call), or nullptr if not found.

set_ui_text

bool set_ui_text(ScriptContext* ctx, EntityHandle element, const char* text);

Buttons

was_ui_button_clicked

Check if a button was clicked this frame. Requires UIInteractionSystem to be running (play mode).

bool was_ui_button_clicked(ScriptContext* ctx, EntityHandle button);

Sliders

get_ui_slider_value

bool get_ui_slider_value(ScriptContext* ctx, EntityHandle slider, float* out_value);

set_ui_slider_value

Value is clamped to the slider's min/max range.

bool set_ui_slider_value(ScriptContext* ctx, EntityHandle slider, float value);

Toggles

get_ui_toggle_state

bool get_ui_toggle_state(ScriptContext* ctx, EntityHandle toggle, bool* out_is_on);

set_ui_toggle_state

bool set_ui_toggle_state(ScriptContext* ctx, EntityHandle toggle, bool is_on);

Progress Bars

get_ui_fill_amount

bool get_ui_fill_amount(ScriptContext* ctx, EntityHandle element, float* out_amount);

set_ui_fill_amount

bool set_ui_fill_amount(ScriptContext* ctx, EntityHandle element, float amount);

Amount is clamped to 0.0 - 1.0.


Visibility

set_ui_visible

Show or hide a UI element. Hidden elements don't render.

bool set_ui_visible(ScriptContext* ctx, EntityHandle element, bool visible);

Example: HUD with Health Bar

static EntityHandle canvas;
static EntityHandle health_bar;
static EntityHandle score_text;
static int score = 0;

void OnStart(ScriptContext* ctx) {
    canvas = ctx->create_ui_canvas(ctx, "HUD", 0);

    health_bar = ctx->create_ui_element(ctx, canvas,
        "HealthBar", "UIProgressBar");
    score_text = ctx->create_ui_element(ctx, canvas,
        "ScoreText", "UIText");

    ctx->set_ui_text(ctx, score_text, "Score: 0");
    ctx->set_ui_fill_amount(ctx, health_bar, 1.0f);
}

void OnUpdate(ScriptContext* ctx) {
    // Update score display
    char buf[64];
    snprintf(buf, sizeof(buf), "Score: %d", score);
    ctx->set_ui_text(ctx, score_text, buf);
}

Example: Pause Menu

static EntityHandle pause_menu;
static bool paused = false;

void OnStart(ScriptContext* ctx) {
    EntityHandle canvas = ctx->create_ui_canvas(ctx, "PauseMenu", 10);
    pause_menu = ctx->create_ui_element(ctx, canvas, "Panel", "UIPanel");

    EntityHandle resume_btn = ctx->create_ui_element(ctx, pause_menu,
        "ResumeBtn", "UIButton");
    EntityHandle quit_btn = ctx->create_ui_element(ctx, pause_menu,
        "QuitBtn", "UIButton");

    ctx->set_ui_visible(ctx, pause_menu, false);
}

void OnUpdate(ScriptContext* ctx) {
    if (ctx->is_key_pressed(ctx, 256)) { // Escape
        paused = !paused;
        ctx->set_ui_visible(ctx, pause_menu, paused);
        ctx->set_cursor_captured(ctx, !paused);
    }

    if (paused) {
        EntityHandle resume = ctx->find_entity_by_name(ctx, "ResumeBtn");
        if (ctx->was_ui_button_clicked(ctx, resume)) {
            paused = false;
            ctx->set_ui_visible(ctx, pause_menu, false);
            ctx->set_cursor_captured(ctx, true);
        }
    }
}

On this page