Script Templates
Ready-to-use script templates for common use cases.
Minimal Runtime Script
Wrapper-based, simplest possible script:
Scripts/Minimal.cpp CPP
1
400">class="text-violet-400">#include "ScriptRuntime.h"
2
3
400">void TickUpdate(400">ScriptContext& ctx, 400">float /*dt*/) {
4
400">if (!ctx.object) 400">return;
5
// Your logic here
6
}
Script with Inspector
Adds custom ImGui UI in the Inspector panel:
Scripts/WithInspector.cpp CPP
1
400">class="text-violet-400">#include "ScriptRuntime.h"
2
400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3
4
400">void TickUpdate(400">ScriptContext& ctx, 400">float /*dt*/) {
5
400">if (!ctx.object) 400">return;
6
}
7
8
400">extern "C" 400">void Script_OnInspector(400">ScriptContext& ctx) {
9
400">ImGui::TextDisabled("Hello from inspector!");
10
(400">void)ctx;
11
}
Rotating Object
Continuously rotates an object with adjustable speed:
Scripts/Rotator.cpp CPP
1
400">class="text-violet-400">#include "ScriptRuntime.h"
2
400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3
4
400">static 400">bool autoRotate = 400">true;
5
400">static 400">glm::400">vec3 rotationSpeed = {0, 45, 0};
6
7
400">void TickUpdate(400">ScriptContext& ctx, 400">float dt) {
8
400">if (!ctx.object || !autoRotate) 400">return;
9
ctx.SetRotation(ctx.object->rotation + rotationSpeed * dt);
10
}
11
12
400">extern "C" 400">void Script_OnInspector(400">ScriptContext& ctx) {
13
ctx.AutoSetting("autoRotate", autoRotate);
14
ctx.AutoSetting("rotationSpeed", rotationSpeed);
15
16
400">ImGui::Checkbox("Auto Rotate", &autoRotate);
17
400">ImGui::DragFloat3("Speed (deg/s)", &rotationSpeed.x, 1.0f);
18
19
ctx.SaveAutoSettings();
20
}
Button Handler
Responds to UI button clicks:
Scripts/ButtonHandler.cpp CPP
1
400">class="text-violet-400">#include "ScriptRuntime.h"
2
3
400">static 400">int clickCount = 0;
4
5
400">void TickUpdate(400">ScriptContext& ctx, 400">float) {
6
400">if (ctx.IsUIButtonPressed()) {
7
clickCount++;
8
ctx.AddConsoleMessage("Clicked " + std::to_string(clickCount) + " times",
9
ConsoleMessageType::Info);
10
}
11
}
Health Bar (Slider)
Read-only slider as a health meter:
Scripts/HealthBar.cpp CPP
1
400">class="text-violet-400">#include "ScriptRuntime.h"
2
400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3
4
400">static 400">float maxHealth = 100.0f;
5
400">static 400">float currentHealth = 100.0f;
6
7
400">void TickUpdate(400">ScriptContext& ctx, 400">float) {
8
ctx.SetUIInteractable(400">false);
9
ctx.SetUISliderStyle(UISliderStyle::Fill);
10
ctx.SetUISliderRange(0.0f, maxHealth);
11
ctx.SetUISliderValue(currentHealth);
12
13
// Color based on health percentage
14
400">float pct = currentHealth / maxHealth;
15
400">if (pct > 0.5f) {
16
ctx.SetUIColor(400">glm::400">vec4(0.2f, 0.8f, 0.2f, 1.0f)); // Green
17
} 400">else 400">if (pct > 0.25f) {
18
ctx.SetUIColor(400">glm::400">vec4(0.9f, 0.7f, 0.1f, 1.0f)); // Yellow
19
} 400">else {
20
ctx.SetUIColor(400">glm::400">vec4(0.9f, 0.2f, 0.2f, 1.0f)); // Red
21
}
22
}
23
24
400">extern "C" 400">void Script_OnInspector(400">ScriptContext& ctx) {
25
400">ImGui::SliderFloat("Current Health", ¤tHealth, 0, maxHealth);
26
400">ImGui::SliderFloat("Max Health", &maxHealth, 1, 200);
27
ctx.MarkDirty();
28
}
FPS Display
Attach to a UI Text object to show framerate:
Scripts/FPSDisplay.cpp CPP
1
400">class="text-violet-400">#include "ScriptRuntime.h"
2
400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3
400">class="text-violet-400">#include <cstdio>
4
5
400">static 400">bool clampFPS = 400">false;
6
400">static 400">float fps = 0.0f;
7
8
400">void TickUpdate(400">ScriptContext& ctx, 400">float dt) {
9
400">if (!ctx.object || ctx.object->type != ObjectType::UIText) 400">return;
10
11
fps = (dt > 0.0f) ? (1.0f / dt) : 0.0f;
12
400">if (clampFPS && fps > 120.0f) fps = 120.0f;
13
14
400">char buf[32];
15
snprintf(buf, 400">sizeof(buf), "FPS: %.1f", fps);
16
ctx.object->ui.label = buf;
17
}
18
19
400">extern "C" 400">void Script_OnInspector(400">ScriptContext& ctx) {
20
ctx.AutoSetting("clampFPS", clampFPS);
21
400">ImGui::Checkbox("Clamp to 120 FPS", &clampFPS);
22
400">ImGui::Text("Current: %.1f FPS", fps);
23
ctx.SaveAutoSettings();
24
}
Custom Editor Window
Creates a custom tab in the editor:
Scripts/CustomTool.cpp CPP
1
400">class="text-violet-400">#include "ScriptRuntime.h"
2
400">class="text-violet-400">#include "ThirdParty/imgui/imgui.h"
3
4
400">static 400">int counter = 0;
5
6
400">extern "C" 400">void RenderEditorWindow(400">ScriptContext& ctx) {
7
400">ImGui::Text("Custom Tool Window");
8
400">ImGui::Separator();
9
10
400">if (400">ImGui::Button("Increment")) {
11
counter++;
12
}
13
400">ImGui::SameLine();
14
400">if (400">ImGui::Button("Reset")) {
15
counter = 0;
16
}
17
18
400">ImGui::Text("Counter: %d", counter);
19
20
400">if (400">ImGui::Button("Log to Console")) {
21
ctx.AddConsoleMessage("Counter is " + std::to_string(counter),
22
ConsoleMessageType::Info);
23
}
24
}
25
26
400">extern "C" 400">void ExitRenderEditorWindow(400">ScriptContext& ctx) {
27
ctx.AddConsoleMessage("Custom window closed", ConsoleMessageType::Info);
28
}