Skip to main content

Scene

In scripts, access the current scene from the mounted scene object.

TypeNameInterface Description
Functionsconstructor()

FunctionscommitCommandBuffer(buffer: CommandBuffer): void

Function: commitCommandBuffer

Parameters

buffer: - command buffer

FunctionscreateSceneObject(name: string): SceneObject

Function: Creates and adds a scene object to this scene.

Parameters

name: - The name of the SceneObject to create.

Returns The created SceneObject.

FunctionsfindSceneObject(name: string, root?: SceneObject): SceneObject | null

Function: Finds a scene object by name from a scene object tree or subtree in the scene. If the root is not provided, the search is performed from the root of the scene. If multiple scene objects share the same name, only the first matching object is returned. So unique names are recommended when using this method, or ensure that the name is unique within the subtree.

Parameters

name: - The name of the scene object to find.

root: - The root scene object of the scene object tree or subtree.

Returns The found scene object, or null if not found.

FunctionsgetAllSceneObjects(): SceneObject[]

Function: get all the sceneObject in the Scene.

FunctionsgetRootSceneObjects(): SceneObject[]

Function: get all the root scene objects in the Scene.

FunctionspostResetEvent(): void

Function: Post a reset event which will take effects next frame. The reset result is the same as "reset on record" feature. This feature works only if the "Reset on Record" setting is "on," which is the default setting.

FunctionsremoveSceneObject(obj: SceneObject): boolean

Function: Removes a scene object from the scene. <br/>Returns false if the object does not belong to the scene or is invalid.

Parameters

obj: - The object to remove from the scene.

Returns Returns true if the object was removed successfully; otherwise false.

Examples

constructor()

let obj = new APJS.Scene();

createSceneObject(name: string): SceneObject

const scene = this.getSceneObject().scene;
const newObj = scene.createSceneObject('newObj');

findSceneObject(name: string, root?: SceneObject): SceneObject | null

let foundObj = this.getSceneObject().scene.findSceneObject('newObj');
if (foundObj) {
this.getSceneObject().scene.removeSceneObject(foundObj);
}

getAllSceneObjects(): SceneObject[]

var sceneObjects = this.getSceneObject().scene.getAllSceneObjects();
sceneObjects.forEach(obj => {
// TODO
})

postResetEvent(): void

export class NewScriptComponent extends APJS.BasicScriptComponent {
private currentScore: number;
onStart() {
// the score should be reset when record start
let callback = (event:IEvent) => {
this.currentScore = 0;
...
}

const globalEmitter = APJS.EventManager.getGlobalEmitter();
globalEmitter.on(APJS.EventType.RecordStart, callback);
}
onUpdate(deltaTime: number) {
// When the score exceeds the limit, a manual reset can be triggered, which will activate all reset logic for the record event.
if (this.currentScore > 100) {
this.getSceneObject().scene.postResetEvent();
}
}
}

removeSceneObject(obj: SceneObject): boolean

let foundObj = this.getSceneObject().scene.findSceneObject('newObj');
if (foundObj) {
this.getSceneObject().scene.removeSceneObject(foundObj);
}

Use Case

Example 1 — Object pool using clone() + setEnabledInHierarchy. Pre-spawn pool of clones from a template, acquire/release with show/hide.

@component()
export class ObjectPool extends APJS.BasicScriptComponent {
@serializeProperty
template!: APJS.SceneObject;

private pool: APJS.SceneObject[] = [];
private initialized = false;
private readonly POOL_SIZE = 10;

onUpdate(dt: number): void {
if (!this.initialized && this.template) {
this.initialized = true;
// Pre-create pool of hidden clones
for (let i = 0; i < this.POOL_SIZE; i++) {
const obj = this.template.clone();
obj.setEnabledInHierarchy(false);
this.pool.push(obj);
}
// Hide the template too
this.template.setEnabledInHierarchy(false);
}
}

acquire(x: number, y: number): APJS.SceneObject | undefined {
if (this.pool.length === 0) return undefined;
const obj = this.pool.pop()!;
obj.setEnabledInHierarchy(true);
const st = obj.getComponent("ScreenTransform") as APJS.ScreenTransform;
if (st) st.anchoredPosition = new APJS.Vector2f(x, y);
return obj;
}

release(obj: APJS.SceneObject): void {
obj.setEnabledInHierarchy(false);
this.pool.push(obj);
}
}

Example 2 — Audio manager with BGM loop + multiple SFX channels — demonstrates the BGM+SFX pattern with separate Audio Player objects

@component()
export class MultiSfxManager extends APJS.BasicScriptComponent {
@serializeProperty
bgmPlayer!: APJS.SceneObject;
@serializeProperty
clickPlayer!: APJS.SceneObject;
@serializeProperty
successPlayer!: APJS.SceneObject;
@serializeProperty
failPlayer!: APJS.SceneObject;

private bgm!: APJS.AudioComponent;
private clickSfx!: APJS.AudioComponent;
private successSfx!: APJS.AudioComponent;
private failSfx!: APJS.AudioComponent;
private initialized = false;

onUpdate(dt: number): void {
if (!this.initialized && this.bgmPlayer) {
this.bgm = this.bgmPlayer.getComponent("AudioComponent") as APJS.AudioComponent;
this.clickSfx = this.clickPlayer.getComponent("AudioComponent") as APJS.AudioComponent;
this.successSfx = this.successPlayer.getComponent("AudioComponent") as APJS.AudioComponent;
this.failSfx = this.failPlayer.getComponent("AudioComponent") as APJS.AudioComponent;
if (!this.bgm || !this.clickSfx) return;

// Start BGM (playMode set to Infinity via DSL)
this.bgm.volume = 40;
this.bgm.play();
this.initialized = true;
}
}

playClick(): void {
this.clickSfx.stop();
this.clickSfx.loopCount = 1;
this.clickSfx.volume = 100;
this.clickSfx.play();
}

playSuccess(): void {
this.successSfx.stop();
this.successSfx.loopCount = 1;
this.successSfx.volume = 100;
this.successSfx.play();
}

playFail(): void {
this.failSfx.stop();
this.failSfx.loopCount = 1;
this.failSfx.volume = 100;
this.failSfx.play();
}
}
Copyright © 2026 TikTok. All rights reserved.
About TikTokHelp CenterCareersContactLegalTerms of ServicePrivacy PolicyCookies