On This Page
API
This is the complete TypeScript API available to you when Scripting.
If you're a beginner, you probably don't need to read this. The chat in the editor will handle things for you!
The first few sections define all the objects that can exist in any game. The remaining sections discuss Scripting & UI. For scripting information, refer to the sections Script and Functions & Services.
Core Objects
Ball
A ball in the world.
| Field | Type | |
|---|---|---|
| material | BallMaterialSettings | null | Visual Material texture settings. |
| opacity | number | 0-1. |
| color | ||
| glow | number | 0-1. How much it shines in its own color whatever the light, and glows onto its surroundings, like neon. 0 is a normal object. |
| isAlwaysOnTop | boolean | Whether to render in front of everything even if visually blocked. This should almost never be used. |
| radius | number | |
| location | ||
| movement | ||
| isWalkthrough | boolean | Whether this object can pass through other objects. |
| isPushable | boolean | Whether physics can move this object: gravity makes it fall and other objects push it. When false, it is totally unmovable. |
| density | number |
Brick
A brick in the world.
| Field | Type | |
|---|---|---|
| material | BrickMaterialSettings | null | Visual Material texture settings. |
| opacity | number | 0-1. |
| color | ||
| glow | number | 0-1. How much it shines in its own color whatever the light, and glows onto its surroundings, like neon. 0 is a normal object. |
| isAlwaysOnTop | boolean | Whether to render in front of everything even if visually blocked. This should almost never be used. |
| size | ||
| location | ||
| movement | ||
| isWalkthrough | boolean | Whether this object can pass through other objects. |
| isPushable | boolean | Whether physics can move this object: gravity makes it fall and other objects push it. When false, it is totally unmovable. |
| density | number |
Cylinder
A cylinder in the world. Its symmetry axis is local Z.
| Field | Type | |
|---|---|---|
| material | CylinderMaterialSettings | null | Visual Material texture settings. |
| opacity | number | 0-1. |
| color | ||
| glow | number | 0-1. How much it shines in its own color whatever the light, and glows onto its surroundings, like neon. 0 is a normal object. |
| isAlwaysOnTop | boolean | Whether to render in front of everything even if visually blocked. This should almost never be used. |
| radius | number | |
| length | number | |
| location | ||
| movement | ||
| isWalkthrough | boolean | Whether this object can pass through other objects. |
| isPushable | boolean | Whether physics can move this object: gravity makes it fall and other objects push it. When false, it is totally unmovable. |
| density | number |
RigidGroup
A RigidGroup is a bunch of objects that move together. All Ball, Brick, and Cylinder child descendants of this are glued together and will move as one rigid body.
If you want to add animations, you must set followSkeletonId, use a SkAnimator to animate it, and add SkAttachment objects to glue objects to the SkJoints. There are some AI tools to automate this.
Group
Use this as a Folder. There is no special behavior, it is simply for organization.
Mesh
A mesh in the world.
To animate this mesh visually, you must set followSkeletonId and use a SkAnimator to animate it.
| Field | Type | |
|---|---|---|
| scale | ||
| meshDataId | ||
| followSkeletonId | ObjectId | null | The objectId of the Skeleton that this mesh will visually follow. |
| physicalObjectId | ObjectId | null | The objectId of the Ball, Brick, Cylinder, or RigidGroup that the mesh will use as a collider and visually follow. |
| material | MeshMaterialSettings | null | Visual Material texture settings. |
| opacity | number | 0-1. |
| color | ||
| glow | number | 0-1. How much it shines in its own color whatever the light, and glows onto its surroundings, like neon. 0 is a normal object. |
| isAlwaysOnTop | boolean | Whether to render in front of everything even if visually blocked. This should almost never be used. |
Label
This is how you render text. All text must be attached to an object.
All measurements are in terms of world units, ie 1 block tall.
| Field | Type | |
|---|---|---|
| text | string | |
| physicalObjectId | ObjectId | null | Required. The objectId of the Ball, Brick, Cylinder, or RigidGroup the label follows. |
| lineHeight | number | |
| maxWidth | number | null | Null means it only breaks on newlines. |
| horizontalAlign | 'left' | 'center' | 'right' | Only applies when there are multiple rows. |
| backgroundColor | Color3 | null | Null means transparent bg. |
| backgroundOpacity | number | |
| offsetFromObject | Additional offset from the object. | |
| rotationFromObject | Additional rotation from the object. | |
| billboardMode | 'none' | 'full' | Whether to swivel to face the camera. |
| isConstantSize | boolean | If true, the label does not shrink with distance, and remains the size as if viewed from 10 units away. |
| opacity | number | 0-1. |
| color | ||
| glow | number | 0-1. How much it shines in its own color whatever the light, and glows onto its surroundings, like neon. 0 is a normal object. |
| isAlwaysOnTop | boolean | Whether to render in front of everything even if visually blocked. This should almost never be used. |
Pivot
This lets you specify a center point that this object will rotate/scale relative to. The pivot moves, turns and scales with the object. Max one per object.
This only applies when using a PropertyAnimator on rotation, or one of the functions on objectService. It is ignored when manually setting rotation/size directly.
Tween
This smoothly changes a value on an object. Typically you should create this with an animationService.tweenTo().
This is equivalent to a PropertyAnimator with 2 keyframes. It is an easier, cheaper way to dynamically move a property if you don't know the values you want beforehand.
- All tween objects are automatically applied to their objects.
tweenTo()creates a tween for you and deletes it once it finishes.- They write the animated value into the real field every step.
| Field | Type | |
|---|---|---|
| targetObjectId | ObjectId | null | |
| propertyPath | string[] | Path to the number on the target object, for example ["location", "rotation", "y"]. |
| fromValue | number | |
| toValue | number | |
| duration | number | In seconds. |
| interpolationStyle | ||
| clockState | Playing from when the tween started. |
Animation Objects
SkAnimator
This animates a Skeleton.
You can have many animators on the same skeleton. They will be blended in order of decreasing priority until each item's weight reaches a total of 100. See also: AnimationService.
Start and stop an animation with .play() and .pause() on this animator's clock, and fade it in and out with .smoothlyChangeWeight().
| Field | Type | |
|---|---|---|
| skeletonId | ObjectId | null | The Skeleton to animate. |
| skAnimationId | ObjectId | null | Using this SkAnimation. |
| clockId | ObjectId | null | The Clock that lets you pause/play it. |
| priority | number | 0-10. |
| weight | number | 0-100. |
| weightTransition | WeightTransition | null |
Skeleton
This is the root of a skeleton. Skeletons only apply to objects with the followSkeletonId field.
This should contain a child SkJoint for each joint in the skeleton. Hierarchies are allowed.
You can (1) animate it and (2) glue objects to it, using SkAnimation, SkAnimator, and SkAttachment.
SkAnimation
This is how you define an animation.
It should contain a keyframe SkKeyframe child for each timestep in your animation.
| Field | Type | |
|---|---|---|
| duration | number | |
| interpolationStyle | The interpolation style of the animation. Use Step for a stop-motion effect. |
SkAttachment
Use this to glue an object in a RigidGroup to an SkJoint.
SkJoint
| Field | Type | |
|---|---|---|
| restPose | This joint's resting location relative to its parent joint. You can change this to move joints around. SkKeyframePose is combined with this pose, so you can change the orientation of a joint during an animation. |
SkKeyframe
A child of SkAnimation.
For each desired joint in this keyframe, it should contain a SkKeyframePose child.
| Field | Type | |
|---|---|---|
| time | number | Time in seconds in the animation. |
SkKeyframePose
A child of SkKeyframe.
The pose of an individual joint.
| Field | Type | |
|---|---|---|
| jointName | string | |
| localPose | This joint's location relative to its restPose. A zero position and rotation leave the joint at its rest pose. |
PropertyAnimator
Use this to smoothly animate one property on any object.
You can have multiple of these at once. They blend independently given a targetObjectId and property, so you can animate multiple fields at once.
- You can't use this to physically change subitems in a RigidGroup. Use a SkAnimator for that instead.
- If you're using this to create a moving platform, be sure it isn't pushable, or else it purposefully won't work - too confusing.
- It writes the animated value into the real field every step.
| Field | Type | |
|---|---|---|
| targetObjectId | ObjectId | null | |
| propertyPath | string[] | Path to the continuous field to animate, for example ["color", "r"], ["opacity"], or ["location", "position", "x"]. |
| propertyAnimationId | ObjectId | null | The PropertyAnimation to play. |
| clockId | ObjectId | null | The Clock that lets you pause/play it. |
| priority | number | 0-10. |
| weight | number | 0-100. |
| weightTransition | WeightTransition | null |
PropertyAnimation
This defines the animation for a PropertyAnimator to play.
It should contain a keyframe PropertyKeyframe child for each timestep in your animation.
| Field | Type | |
|---|---|---|
| duration | number | |
| interpolationStyle |
PropertyKeyframe
A child of PropertyAnimation.
| Field | Type | |
|---|---|---|
| time | number | |
| value | number |
Other Objects
Clock
A clock is a helper object that says how far along the animation is in a SkAnimator, PropertyAnimator, or SoundPlayer.
| Field | Type | |
|---|---|---|
| clockState | Whether it is paused or playing, and how far along it is. | |
| shouldLoop | boolean | Whether it should loop when done. |
| speed | number | A multiplier onto the normal speed. |
Material
An image or "texture" that is shown on an object. Albedo is the main texture. The other fields are optional PBR properties.
| Field | Type | |
|---|---|---|
| albedoTextureDataId | DataId | null | This is the main texture for color. Four values (RGBA) per pixel. |
| metallicTextureDataId | DataId | null | Optional metallic information. One value per pixel. |
| roughnessTextureDataId | DataId | null | Optional roughness information. One value per pixel. |
| normalTextureDataId | DataId | null | Optional normal information. Three values (XYZ) per pixel. |
| alphaMode | Says how to handle the underlying object's transparency. Only relevant when albedoTextureDataId has transparency in it. | |
| isDoubleSided | boolean | Render both sides of the surface, with back-face normals reversed for lighting. |
Player
You can never create or delete a Player object yourself. It is automatically created and deleted when a player joins and leaves. It is important for you to set the head and character, or the player won't be able to see or move.
| Field | Type | |
|---|---|---|
| username | string | |
| userid | string | |
| headObjectId | ObjectId | null | The objectId of the Ball, Brick, Cylinder, or RigidGroup the player's camera will follow. |
| characterObjectId | ObjectId | null | The objectId of the Ball, Brick, Cylinder, or RigidGroup this player controls. |
Script
Every Script is either a Server or Client script.
- Client scripts run on every client.
- Server scripts run on the server.
- Some APIs are only exposed to one or the other; read the docs.
- Deleting a Script stops it. Its listeners, timers,
tick()loops and GUI stop, and its exports can no longer be called.
Import/Export:
- It is valid to write
import { functionName } from './scriptName'. Hiererarchies of object names are valid. - Script names, paths, & contents are only read once when the script is created.
Server/Client communication:
- Write
'use server'at the top of a Server script to make all exports importable by Client scripts. - Write
'use client'at the top of a Client script to make all exports importable by Server scripts. - The first parameter to all client functions must be the player's user id.
- Exports must be async functions.
- Exports must be validly callable by the other side.
- You should validate server function inputs and client function returns, as these are untrusted.
UI:
- We expose React-like syntax to draw UI on the screen. It is drawn by a real browser engine, so every Tailwind CSS v4 class works, including arbitrary values like
w-[42%], and text defaults to black and 16px as on any web page. - Use
<div>for layout and text. Pointer input on a div reaches both the div (its hover styles, onClick and onHover) and the game. - Use
<button>with onClick for clickable UI. A button keeps the pointer to itself, so clicking it does not click the game. The innermost element with an onClick handles the click. - You may only use
<div>,<button>, text, arrays, null, className, onClick, and onHover primitive props. - Style with
classNameonly. Do not use style props or unsupported HTML tags. - Each shown GUI covers the whole screen, so
w-fullandh-fullmean the whole screen. Place your content with Tailwind, likeabsolute top-4 left-4for a corner,absolute bottom-6 left-1/2 -translate-x-1/2for the bottom middle, orabsolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2for the center. Without that it sits in the top left corner. If you use screen-filling wrappers, you can usepointer-events-noneto keep them from blocking other GUIs that mount, andpointer-events-autoon the content inside. - Build a meter bar as a fixed-size track with a percent-width fill inside it, never as a row of recolored squares. Round the percent to a whole number so the class string does not change every frame.
const HealthMeter = ({ fraction }: { fraction: number }) => { const percent = Math.round(Math.min(1, Math.max(0, fraction)) * 100) return <div className="w-48 h-4 rounded-full bg-black/50 p-1 overflow-hidden"> <div className={`h-full rounded-full bg-emerald-400 w-[${percent}%]`} /> </div>}useState()works like usual.createState()works for state that comes from outside react, eg for 'use client' functions. This is similar to useSyncExternalStore.- Write
createState(initialValue). The.get()function automatically subscribes the relevant React components to re-render when.set()is called..set()is intended to be defined inside a'use client'function and called from the server.
Libraries:
- You can use
setTimeout()andsetInterval(). Scripts also exposeconsole,URL,TextEncoder/TextDecoder,structuredClone,atob/btoa,Event/EventTarget, andAbortController. - There is no
fetch, noWebSocket, no storage, and nocrypto(useMath.random()).
Managing Objects:
- Only the server can create and modify objects.
- All objects in the world are replicated to all users. You cannot create an object on just one client.
| Field | Type | |
|---|---|---|
| objectLocation |
SoundPlayer
WorldLighting
Controls the sun location and sky settings.
| Field | Type | |
|---|---|---|
| sunOrientation | ||
| sunColor | ||
| sunIntensity | number | |
| sunShadowSoftness | number | How soft sun shadows are: how far every shadow edge blurs, in world units. 0 gives hard shadows. |
| ambientTopColor | ||
| ambientBottomColor | ||
| ambientIntensity | number | |
| ambientOcclusionIntensity | number | 0-1. How dark ambient occlusion can make creases and the ground right next to objects. 0 turns it off, 1 lets the deepest creases go black. |
| ambientOcclusionRadius | number | How far ambient occlusion reaches onto nearby surfaces, in world units. |
| ambientOcclusionSunlightStrength | number | 0-1. How much ambient occlusion also darkens sunlight. 0 darkens only the sky light. |
| skyTopColor | The gradient sky color straight overhead. | |
| skyHorizonColor | The gradient sky color at the horizon, which both halves of the gradient start from. | |
| skyBottomColor | The gradient sky color straight down, below the horizon. | |
| skyboxTextureDataId | DataId | null | An equirectangular skybox TextureData id. Transparent pixels reveal the gradient sky. |
| skyboxTextureOpacity | number | 0 means the skybox texture is hidden. 1 means the skybox texture is fully visible. |
| skyReflectionStrength | number | 0-1. How strongly shiny and metal surfaces reflect the sky. 0 turns sky reflections off. |
| vibrance | number | 0-1. Pushes dull colors further from gray, and already vivid ones barely at all. 0 turns it off. |
Functions & Services
stopScript
Use await stopScript() to stop all further execution of a script.
()
Promise<never>
tick
Use await tick() to await the next tick of the game loop. Always use this in places like infinite while loops, otherwise the script will stall and be killed.
()
Promise<void>
vec3
PlayerService
To deal with players joining or leaving, use the object service.
- Join:
game.objectService.addObjectCreatedListener((player) => { ... }, "player") - Leave:
game.objectService.addObjectDeletedListener((playerObjectId) => { ... }, "player").
| Field | Type | |
|---|---|---|
| getAllPlayers | ||
| getLocalPlayerObjectId | Only callable by a Client Script. | |
| setLocalPlayerMetadata | Share state about your player with the server and other clients. For example, which animation is currently playing on your character. Note: It is sent urgently, so you can use it for e.g. animations. Numbers are rounded to 3 decimal places to save bandwidth. Only callable by a Client Script. | |
| getPlayerMetadata | The last JSON value received from this player, or null. | |
| getPlayerCameraDirection |
JsonValue
ObjectService
This service exposes methods for reading and modifying objects.
All of the functions here are recursive: scale, rotate, move, setObjectWalkthrough, etc., meaning they apply to the object and all of its children.
If you only want to operate on one object and not its children, simply write object.propery = value, and don't use the functions here.
If you call these in a Client script the changes are only applied locally (not broadcast).
| Field | Type | |
|---|---|---|
| getObjectById | Returns the object with this ObjectId. | |
| getObjectByName | Returns any object with this name. | |
| getObjectsByName | Returns all the objects with this name. | |
| getObjectsByType | Returns all the objects with this type. | |
| createObject | ||
| deleteObject | ||
| cloneObject | Remember to move the clone afterwards so it doesn't overlap. | |
| createSkAttachmentsInRigidGroup | ||
| scaleObjectBy | Scales the object by the multiplier. References Pivot if there is one. Note that repeatedly calling this will grow/shrink the object multiple times. | |
| rotateObjectBy | Rotate the object around the provided | |
| rotateObjectTo | Rotate the object to the provided rotation, in degrees like | |
| moveObjectBy | ||
| moveObjectTo | ||
| setObjectWalkthrough | ||
| setObjectPushable | ||
| setObjectDensity | ||
| castRay | Casts a ray through the physics world and returns the closest hit, or null. The direction does not need to be normalized. | |
| castObjectShape | Casts the object and returns the closest hit, or null. The direction does not need to be normalized. | |
| getGroundSupport | What the object is standing on, or null. Use this to check if a character is grounded. | |
| getVelocityRelativeToGround | Shortcut that uses | |
| getGravity | The world's gravity, in distance per second squared. | |
| getObjectAxes | Get the x, y, z basis vectors (axes) of the object, based on its current rotation. | |
| addObjectCreatedListener | Fires when an object is created. Does not fire for objects that already existed when the world loaded. | |
| removeObjectCreatedListener | ||
| addObjectDeletedListener | Fires when an object is deleted. Deleting an object fires this for it and every descendant. | |
| removeObjectDeletedListener |
ObjectCreatedCallback
ObjectDeletedCallback
RaycastHit
What castRay, castObjectShape, and getGroundSupport hit.
| Field | Type | |
|---|---|---|
| object | The Ball, Brick, or Cylinder that was hit. For a RigidGroup, this is the subitem that was hit. | |
| distance | number | How far the ray or shape traveled before it hit. |
| position | World-space point where it hit. | |
| normal | Unit vector pointing out of the surface that was hit. |
RaycastOptions
| Field | Type | |
|---|---|---|
| maxDistance | number | Stop looking past this distance. Defaults to unlimited. |
| includeWalkthrough | boolean | Whether isWalkthrough objects can be hit. Defaults to false. |
| excludeObjectIds | ObjectId[] | Objects the ray should pass through. Excluding a RigidGroup excludes all of its subitems, so pass a character's RigidGroup id here to not hit yourself. |
ShapeCastOptions
| Field | Type | |
|---|---|---|
| maxDistance | number | Stop looking past this distance. Defaults to unlimited. |
| includeWalkthrough | boolean | Whether isWalkthrough objects can be hit. Defaults to false. |
| excludeObjectIds | ObjectId[] | Objects the ray should pass through. Excluding a RigidGroup excludes all of its subitems, so pass a character's RigidGroup id here to not hit yourself. |
| startOffset | Defaults to no offset. |
GroundSupportOptions
| Field | Type | |
|---|---|---|
| maxDistance | number | Defaults to 0.01. |
| maxGroundSlopeDegrees | number | Defaults to 55. |
AnimationService
This service exposes methods for smoothly transitioning animation values.
| Field | Type | |
|---|---|---|
| smoothlyChangeWeight | animatorId: ObjectId, targetWeight: number, durationMs: number, interpolationStyle?: InterpolationStyle → void | Use this to smoothly change the weight of a SkAnimator or PropertyAnimator. |
| tweenTo | objectId: ObjectId, propertyPath: string[], targetValue: number, durationMs: number, interpolationStyle?: InterpolationStyle → | Use this any time you want to smoothly move one of an object's numbers to a new value, like opening a door when a button is pressed. For example, The number moves from its current value to targetValue over durationMs, and then stays there. Tweening a number that is already tweening starts from wherever it has got to. While a tween plays, it wins over any PropertyAnimator on the same number, and it overwrites anything a script writes to that number. This returns the Tween object. It sits at the world root while it plays and deletes itself when it finishes. Delete it yourself to stop the tween where it is. |
ClockService
This service exposes methods for controlling Clock objects on SkAnimator, PropertyAnimator, and SoundPlayer.
CollisionService
- collisionService fires even when isWalkthrough=true.
- For RigidGroups, collisionService fires using the subitem(s) involved in the collision.
| Field | Type | |
|---|---|---|
| addCollisionListener | Only fires once, when the collision starts. It does not keep firing while the objects stay in contact. | |
| removeCollisionListener | ||
| addCollisionStopListener | ||
| removeCollisionStopListener |
CollisionCallback
ClientCharacterService
Only callable by a Client Script.
| Field | Type | |
|---|---|---|
| addBeforeStepListener | This is the preferred way to program a character controller, vehicle controller, etc. It runs on the client, right before each physics step. In order to detect quick key/mouse inputs, you should usually save them in a variable and have this function make relevant changes.
You're allowed to use functions like Example usage: | |
| removeBeforeStepListener | ||
| addAfterStepListener | Similar to | |
| removeAfterStepListener |
CharacterStepCallback
A function that returns the changes you want to make to the character. This is called per physics step. You can't await here.
To time things across steps, add up dtSecs. getTime() is also accurate here.
CharacterChanges
GuiService
Only callable by a Client Script.
The guiKey can be anything; it is a string you pick to identify the GUI root.
| Field | Type | |
|---|---|---|
| show | Example: | |
| hide | guiKey: string → void | Example: |
useState
Only callable by a Client Script.
initialState: T | (() => T)
[T, (nextState: T | ((prevState: T) => T)) => void]
createState
Only callable by a Client Script.
initialState: T
{ get: () => T; set: (nextState: T | ((prevState: T) => T)) => void; }
GuiRootRenderable
GuiRenderable | (() => GuiRenderable)
GuiRenderable
This is the equivalent to a React Node.
The typical usage is <MyComponent />.
You can also use strings, numbers, booleans, null, and undefined.
Vec3Math
Common vector math functions for Vec3s. Every function returns a new vector.
Example usage: const velocity = vec3.scale(vec3.normalize(direction), speed).
| Field | Type | |
|---|---|---|
| add | ||
| sub | a minus b. | |
| scale | ||
| dot | ||
| cross | ||
| length | ||
| normalize | Length 1, or the zero vector if v has no length. | |
| clampLength | ||
| projectOntoPlane |
Uploads and Data
Assets
The 'Assets' page contains a bunch of public objects anyone can use in their game. If you make an object, mesh, script, skybox, etc that other people might find useful to use in their game, we encourage you to upload it there. Assets can be deleted and changed at any time. If you update an asset, it won't update in games that have already downloaded it.
Catalog
The 'Catalog' page is full of objects that people can buy and wear as hats. As a developer, you can think of it as the 'Assets' page, but with meshes only. Catalog items can't be deleted because people can buy them, but they can be made private.
Data
The 'Data' page (hard to find, but you can get to it on some assets) is blob storage for sounds, textures, and meshes. Lots of places reference it, including most assets and catalog items. Data is immutable once created, but it can be deleted.
Upload Constraints
Every file can be at most 16 MiB.
- Mesh: a .glb with embedded textures, at most 8 MiB.
- Texture: a PNG, JPEG, or WebP image, at most 2048 pixels per side.
- Sound: Ogg Vorbis, MP3, WAV, or FLAC.
- Material: a color image, plus optional normal, roughness, and metalness images, each following the Texture rules and at most 64 MiB together.
- Skybox: a PNG, JPEG, or WebP panorama exactly twice as wide as it is tall, at most 4096 x 2048.
- Object: An object published from the world. Can't come from a file; use the chat to do this, it's a special tool.
Reference
LiveObject
Scripts usually deal with this object type.
It contains all the fields of either a Ball, Brick, Clock, Cylinder, Label, LocalGroup, SkJoint, SkAnimation, SkAnimator, SkAttachment, SkKeyframe, SkKeyframePose, Material, Mesh, Pivot, Player, PropertyAnimation, PropertyAnimator, PropertyKeyframe, RigidGroup, Script, Skeleton, SoundPlayer, Tween, or WorldLighting.
This object is a proxy, meaning every time you read a value from it, you get the current value in the world.
You can also set fields on it, and they will affect the real object in the world.
If the object is deleted, the id remains readable, but other fields will throw an error. Use getObjectById(), or a try/catch, if you think the object might be deleted.
And it contains the following additional fields:
| Field | Type | |
|---|---|---|
| id | ||
| type | 'ball' | 'brick' | 'clock' | 'cylinder' | 'group' | 'label' | 'material' | 'mesh' | 'pivot' | 'player' | 'propertyAnimation' | 'propertyAnimator' | 'propertyKeyframe' | 'rigidGroup' | 'script' | 'skAnimation' | 'skAnimator' | 'skAttachment' | 'skeleton' | 'skJoint' | 'skKeyframe' | 'skKeyframePose' | 'soundPlayer' | 'tween' | 'worldLighting' | |
| name | string | |
| parent | LiveObject | null | |
| getChild | ||
| getChildren |
ObjectLocation
"Server" | "Client"
ClockState
If paused: animationTimeSecs is the duration into the animation to show.
If playing: localStartMs is the timestamp at which the animation started to play. The other field timeLocation says whether this timestamp is relative to the server's clock or the client's clock.
| { Paused: { animationTimeSecs: number } } | { Playing: { localStartMs: number, timeLocation: ObjectLocation } }
InterpolationStyle
"Step" | "Linear" | "EaseInOut" | "EaseIn" | "EaseOut"
WeightTransition
| Field | Type | |
|---|---|---|
| startedAtMs | number | The wall-clock ms at which the weight transition started in timeLocation. |
| timeLocation | Whether startedAtMs is client time or estimated server time. | |
| initValue | number | |
| finalValue | number | |
| durationMs | number | |
| easing |
BallPrimitiveSettings
| Field | Type | |
|---|---|---|
| radius | number |
CylinderPrimitiveSettings
| Field | Type | |
|---|---|---|
| radius | number | |
| length | number |
BrickPrimitiveSettings
| Field | Type | |
|---|---|---|
| size |
BallMaterialSettings
CylinderMaterialSettings
BrickMaterialSettings
MeshMaterialSettings
AlphaMode
This only applies to Material objects whose albedoTextureDataId have transparency. Default is Opaque.
- Opaque means to render the underlying object as solid, meaning show the base color in the transparent areas.
- Mask makes the underlying object either opaque or invisible in areas, based on the transparency cutoff.
- Blend uses the texture alpha multiplied by the object opacity for smooth transparency.
"Opaque" | { Mask: { cutoff: number } } | "Blend"
ObjectInfo
This is a helper type. It contains all the fields of either a Ball, Brick, Clock, Cylinder, Group, SkJoint, SkAnimation, SkAnimator, SkAttachment, SkKeyframe, SkKeyframePose, Material, Mesh, Pivot, Player, PropertyAnimation, PropertyAnimator, PropertyKeyframe, RigidGroup, Script, Skeleton, SoundPlayer, Tween, or WorldLighting,
plus a type field saying which one it is.
Vec3
| Field | Type | |
|---|---|---|
| x | number | |
| y | number | |
| z | number |
ObjectId
Every object in the world gets a unique id that you can use to reference it. It's just a number. These object ids may change between compile time and runtime. We automatically convert most object ids, but you should not hard-code object ids into scripts as we can't parse those until runtime.
number
DataId
"Data" generally means large assets that are uploaded and given an id, like mesh data and texture data. Objects reference them using their data id.
number
UserId
The unique id of the user. This will never change, so you should use it when tracking players. It is preferred over the player's username or the Player object's id.
string
Location3D
This is called "location", but really means both position and rotation. In other words, the full information needed to place the object in 3D at snapshot in time. Can be global or local depending on context.
Movement3D
Speed information of an object. The derivative of Location3D.
PhysicsToggles3D
A helper type.
| Field | Type | |
|---|---|---|
| isWalkthrough | boolean | Whether this object can pass through other objects. |
| isPushable | boolean | Whether physics can move this object: gravity makes it fall and other objects push it. When false, it is totally unmovable. |
| density | number |
Color3
RGB color.
| Field | Type | |
|---|---|---|
| r | number | Red on a scale of 0-1. |
| g | number | Green on a scale of 0-1. |
| b | number | Blue on a scale of 0-1. |
VisualSettings
A helper type.
| Field | Type | |
|---|---|---|
| opacity | number | 0-1. |
| color | ||
| glow | number | 0-1. How much it shines in its own color whatever the light, and glows onto its surroundings, like neon. 0 is a normal object. |
| isAlwaysOnTop | boolean | Whether to render in front of everything even if visually blocked. This should almost never be used. |
PhysicsInfo3D
A helper type.
| Field | Type | |
|---|---|---|
| location | ||
| movement |
Orientation3D
A helper type.
| Field | Type | |
|---|---|---|
| theta | number | Degrees around the vertical direction. Starts at Z and goes clockwise around Y. This is what changes when you look left or right. |
| phi | number | Degrees with respect to the horizon (XZ plane). Upwards is positive. This is what changes when you look up or down. |
CameraLocation
A helper type.
| Field | Type | |
|---|---|---|
| position | ||
| orientation |