Use the canonical API paths to call object APIs on
game.scene.SceneName.ObjectPath, global APIs on game.rustic, and file APIs
on game.rustic.files.ExplorerPath. Existing calls below remain supported.
Use a named scene and the object's full hierarchy path to change its built-in properties from a script attached elsewhere. For example:
return {
Start = function()
rustic.game.Demo.Room.Player:EditAttribute("Position", {1, 2, 3})
rustic.game.Demo.Room.Player:EditAttribute("Anchored", true)
end,
}- Open a scene named Demo in the editor. The name used here is the scene's document name, not the script filename or project name.
- Create a root object named Room, then a child named Player. Give siblings
unique names. The full object path is
Room.Player. - Use Programming > Object Component Script, select Lua, and paste the example. Save it. Select another object such as Controller and attach the script using Programming > Attach Existing Script or + Add Component in the Inspector. Scene/global startup scripts can also target objects by path.
- Press Play. Player moves to local position
(1, 2, 3)and becomes anchored; Controller keeps its own position. Changes affect the Play snapshot. Stop Play to return to the authored scene, or use the editor's runtime-change workflow when you want to retain supported changes.
Only the active scene is accessible through object paths. Other loaded scenes
retain their state until selected with game.scene.switchTo(name). Use the
scene lifecycle API to load and unload them.
Referring to another scene does not load it. Names are case-sensitive. Paths are resolved when a call applies;
if you rename or reparent an object, use its new path in subsequent calls.
These functions edit engine attributes, not another script's public properties
or arbitrary user-defined functions.
The colon is Lua method-call syntax. Other languages use their own member and method syntax for the same engine operation. Use these inside the language's existing startup/update callback, following its scripting guide's setup:
// JavaScript and HTML inline JavaScript
rustic.game.Demo.Room.Player.EditAttribute("Position", [1, 2, 3]);# Generated Python SDK
rustic.game.Demo.Room.Player.EditAttribute("Position", [1, 2, 3])// Generated C# SDK
rustic.game.Demo.Room.Player.EditAttribute("Position", new double[]{1, 2, 3});// C++: runtime names use subscripts rather than compile-time fields
rustic.game["Demo"]["Room"]["Player"].EditAttribute("Position", RusticValue::Array{1.0, 2.0, 3.0});// PHP SDK, inside a callback declaring global $rustic
$rustic->game->Demo->Room->Player->EditAttribute("Position", [1, 2, 3]);Use brackets for a name containing spaces or reserved words, for example
rustic.game["My Scene"]["Room"]["Player One"] in Lua, JavaScript, Python,
and C#. C++ already uses brackets; PHP supports ->{"Player One"}.
A hierarchy segment named EditAttribute, edit_attribute, GetAttribute, or
get_attribute can shadow proxy methods. For those names use the full-path helper
through the native SDK in external adapters.
Dots in object names are ambiguous with hierarchy separators; use names without
dots for this path API. Scenes may contain dots in their names because the runtime
matches the complete loaded scene name before resolving the object hierarchy.
-- Luau uses the same colon syntax as Lua
rustic.game.Demo.Room.Player:EditAttribute("Position", {1, 2, 3})// Java names are selected with methods because fields must exist at compile time
rustic.game.scene("Demo").object("Room.Player").EditAttribute("Position", new double[]{1, 2, 3});// C selects the scene and hierarchy through string arguments
rustic.game.EditAttribute("Demo", "Room.Player", "Position",
(RusticValue){.type=RUSTIC_VECTOR,.vector={1,2,3},.length=3});All gameplay languages use engine-owned APIs. The engine handles command transport; use the native calls above without serializing or printing requests/responses. CSS alone cannot call functions; use inline JavaScript in an HTML UI asset.
Embedded Lua applies edits immediately. Every gameplay language can read another object using rustic.get_object_attribute(source, name) or its path proxy's GetAttribute method (C uses rustic.game.GetAttribute(source, name)). JavaScript and external languages queue edits in issue order. A live query flushes those edits before reading; owner getters still read the callback snapshot. See APIs in every language for native signatures.
| Attribute | Value | Meaning |
|---|---|---|
Name |
string | Changes the object's name and future path |
Position |
three finite numbers | Local translation relative to parent |
Size |
three finite numbers | Local transform scale |
Color |
three finite numbers | RGB; preserves existing alpha |
CanTouch |
boolean | Enables object clicks/taps; does not affect solid response |
CanCollide |
boolean | Enables solid box collisions with other collidable primitives in Play |
Anchored |
boolean | Prevents physics movement; unchecked primitives fall under gravity |
Parent |
stable entity ID or null | Reparents the target; changes future path |
EditAttribute and edit_attribute are equivalent. The shared
helper rustic.edit_object_attribute(source, name, value) also accepts the full
path string. Material and Enabled are not supported attributes; set_enabled
still affects the script owner.
Physics runs after fixed-update callbacks. Imported meshes do not yet simulate; curved and rotated primitives use enclosing boxes. Physics does not dispatch collision callbacks. See the Basic physics guide for setup and limitations.
- Scene is not loaded: check the scene document name and that it is the scene
being played. The API resolves paths of the form
rustic.game.<scene-name>.<hierarchy>. - Object was not found: match every parent in the Hierarchy; check spelling, case, and any earlier rename/reparent. Check that the object exists in Play.
- Ambiguous: two objects have the same full path. Rename siblings uniquely.
- Type mismatch / unknown attribute: use the table above; vectors must have exactly three finite numbers, and booleans must be actual boolean values.
- Missing SDK member: regenerate the programming workspace with the updated engine. Preserve your script and use the native SDK call shown above. External languages still require their toolchains.
An invalid call reports a scripting error and can fail that behavior. Queued commands applied before a failure remain applied; a callback is not a transaction.