Appearance
Scene
前言
scene是使用代码模式制作的功能相对完整的场景,如 视频教程 里的收集组件。
scene可以插入到橙光剧情中使用,scene可以实现不方便用剧情表现的功能,如背包、画画、行程安排等。
1、scene的结构
在创建Scene时,需要注意两点:
- 类名尽量和文件名相同
- 类名尽量和
LM.Class的参数相同,使用@LM.Class(${类名})装饰器注册类名。注册后,在橙光中的呼叫Scene里,可以看到该Scene。 - 可在注册
LM.Class时添加传入传出参数类型和备注,可在工具端添加scene时方便添加传入传出参数。
typescript
//注册类名
@LM.Class("TestScene",{
IN: [{ TYPE: "INT", DES: "备注1", DEFAULT: 100 }],
OUT: [
{ TYPE: "STR", DES: "备注2" },
{ TYPE: "OBJ", DES: "备注3" },
{ TYPE: "LIST", DES: "备注4" }
]
})
export default class TestScene extends LM.Scene {
// 场景初始化方法
init() {
// 在这里添加场景内容
// 例如:背景、UI元素等
}
//update可以没有,初始化之后每一帧都会调用,不推荐写得太复杂
update() {
// 更新场景内容
// 例如:更新UI、更新状态等
}
}1.1 悬浮组件scene(FloatingPanel)
注意事项:
- 悬浮组件scene,可以悬浮在橙光剧情之上。仅能通过橙光剧情呼叫
- 通过
addChild添加的图片和按钮组件,默认不会穿透,如果想穿透,需要设置LM.Scene的属性isPenetrable: true; - 通过killAllScenesToParent()接口无法关闭悬浮组件scene,仅能通过橙光事件和this.close()接口关闭
- 使用
@LM.FloatingClass(${类名})装饰器注册类名,注册后,在橙光中的悬浮组件开关scene里,可以看到该Scene。 - 与注册scene类似,也可以为悬浮组件scene添加传入传出参数类型和备注,可在工具端添加scene时方便添加传入传出参数。
typescript
//注册类名
@LM.FloatingClass("TestScene",{
IN: [{ TYPE: "INT", DES: "备注1", DEFAULT: 100 }],
OUT: [
{ TYPE: "STR", DES: "备注2" },
{ TYPE: "OBJ", DES: "备注3" },
{ TYPE: "LIST", DES: "备注4" }
]
})
export default class TestScene extends LM.FloatingPanel {
// 场景初始化方法
init() {
// 在这里添加场景内容
// 例如:背景、UI元素等
}
//update可以没有,初始化之后每一帧都会调用,不推荐写得太复杂
update() {
// 更新场景内容
// 例如:更新UI、更新状态等
}
}2、呼叫
2.1 在橙光中呼叫scene
1.在build完成后,可以在橙光的逻辑→呼叫scene(勾选代码模式),在下拉列表中选择注册为LM.Class的Scene。

2.在build完成后,可以在橙光的消息→悬浮组件开关(选择单独组件、代码模式悬浮组件),在下拉列表中选择注册为LM.FloatingClass的Scene。(多次打开同一个悬浮组件Scene时,需要把前一个先关闭。) 
2.2 在scene呼叫
使用如下代码即可呼叫另一个scene。
LM.showScene("TestScene");3、关闭
关闭scene
使用如下代码可以关闭当前scene。
this.close([]);回橙光剧情
使用如下代码可以关闭所有scene并回到剧情。
typescript
LM.killAllScenesToParent();跳转橙光剧情
跳转橙光剧情,剧情id,下面的001,也就是1 为剧情id 
typescript
//跳转到id为1的橙光剧情
LM.jumpStory(1);4、传入参数
接收传入参数如下所示
typescript
let A = this.params[0];//将第1个传入参数赋值给A
let B = +this.params[1];//将第2个传入参数赋值给B +号可以将字符串转换为数值 确保类型正确注:在数值类传入参数前面加“+”可将字符串转换为数值,确保类型正确。
测试使用小技巧
我们在使用npm run dev开发时,因为脱离了橙光环境,所以传入参数会没有值,我们可以通过获取运行环境判断是否为dev环境。 具体使用方式按工程需求处理。
typescript
const testInData = [
'测试字符串',
1234
]
export class TestScene extends LM.Scene{
/**
* 测试参数
*/
private inData:[string,number];
init(){
// 获取当前运行环境 使用npm run dev 获取到的环境就是dev 以此进行测试,这里非dev环境就是用传入的参数
this.inData = LM.getRunEnv() === "dev" ? testInData : this.params;
}
}5、传出参数
在关闭scene时传出,如下
typescript
let A = 1;
let B = "ok";
this.close([A,B]);//将A,B作为传出参数 A位传出参数1 B为传出参数2两个Scene,SceneA呼叫SceneB,SceneB关闭后,SceneA如何知晓SceneB关闭,并拿到SceneB的传出参数?
在SceneA中添加onSceneClose方法,一旦有Scene关闭,此方法会被调用,传入的参数包含关闭Scene的id和关闭Scene的传出参数。
typescript
@LM.Class("SceneA")
export class SceneA extends LM.Scene {
private _sceneBId:string = '';
init(): void {
const button = new LM.Button();
button.text = "Open SceneB";
button.fontSize = 40;
button.fontColor = "#ffffff";
button.y = 200;
button.onClick(async ()=>{
this._sceneBId = await LM.showScene("SceneB");
})
this.addChild(button);
}
onSceneClose(data: LM.LMSceneCloseData): void {
if(data.id == this._sceneBId){ // 是SceneB关闭 两个id相同,多个scene同时存在时可以用来判断是哪个关闭了
this._sceneBId = '';
console.log(data.outData); // 打印sceneB的传出参数
}
}
}
@LM.Class("SceneB")
export class SceneB extends LM.Scene {
init(): void {
const button = new LM.Button();
button.text = "Close SceneB";
button.fontSize = 40;
button.fontColor = "#ffffff";
button.y = 400;
button.onClick(()=>{
this.close(["SceneB的传出参数1"])
})
this.addChild(button);
}
}6、在橙光中传入和接收参数
在橙光的呼叫中,需要传入传出参数的数量和类型都对应上,参数顺序不可变化。 传出后,数值和字符串会被赋值到橙光剧情内对应的变量中。
