v3.0.0 新增
ctx.performance 让扩展感知演出段:一段用开始标记和结束标记框住、按时间轴自动播放的内容。演出进行中玩家不能推进剧情;打开菜单、窗口最小化或 Steam 浮层弹出时,整段暂停。 扩展通常用它做这几件事:
  • 演出开始时收起挡画面的浮层,结束后再显示;
  • 演出暂停时,同步暂停自己的计时或动画;
  • 避免在演出中调用会等待玩家或跳转剧情的功能。

API

方法返回值说明
isActive()boolean当前是否有演出段正在播放,暂停中也算
isPaused()boolean当前演出是否暂停,不在演出中时返回 false
getInfo()PerformanceSegmentInfo | null当前演出段的快照,不在演出中时返回 null
onChange(listener)取消订阅函数订阅演出的开始、结束、暂停和恢复

PerformanceSegmentInfo

快照只代表读取那一刻的值。
字段说明
id演出段 id,也就是开始标记的块 id
name开始标记上填写的演出名,没有名字时不含这个字段
time已经播放到的段内时间(毫秒),暂停期间不前进
duration演出总长度(毫秒)
paused读取时演出是否暂停

onChange 事件

回调收到 { type, id },其中 id 是演出段 id:
type触发时机
start演出开始播放
end演出结束:正常播完、玩家快进跳过,以及被读档等操作打断都会发出
pause因菜单、窗口最小化、Steam 浮层等原因暂停
resume从暂停恢复
  • 只通知订阅之后发生的变化。订阅时需要当前状态,先调用 isActive()。
  • 回调同步执行,不要在里面做耗时操作。
  • 界面或功能提前停用时,调用返回的函数取消订阅。

案例:演出时收起状态栏

输入: 扩展有一个常驻 HUD status-hud,剧本进入演出段「开场」。
@extension({ id: "status-hud", label: "状态栏", autonomous: true })
export class StatusHud extends Extension {
  static onRegister(ctx: ExtensionContext) {
    ctx.performance.onChange((event) => {
      if (event.type === "start") void ctx.ui.hide("status-hud");
      if (event.type === "end") void ctx.ui.show("status-hud");
    });
  }
}
输出: 演出开始时状态栏收起,演出结束(包括快进跳过、读档打断)后重新显示。

案例:读取演出进度

const info = ctx.performance.getInfo();

console.log(info && {
  name: info.name,
  progress: info.time / info.duration,
  paused: info.paused,
});
输出: 演出中输出类似 { "name": "开场", "progress": 0.42, "paused": false };不在演出中时输出 null。

声明方法可在演出中使用

剧本方法可以放进演出段里调用,但如果它会等待玩家或跳转剧情,演出可能无法正常进行。方法很快执行完、不等待玩家操作(不打开需要玩家关闭的界面、不等点击),也不改变剧情流程时,声明 performanceSafe: true:
static flashBadge = this.method({
  title: "闪一下徽章",
  performanceSafe: true,
  run(ctx) {
    // 只更新自己的界面状态,立即返回
  },
});
这个声明只影响 Studio 的提醒:没有声明的方法放进演出段时,检查器和剧本行上会提示「调用扩展方法:如果它会等待玩家或跳转剧情,演出可能无法正常进行」,声明后不再提示。运行时行为不变,演出不会等待方法返回,下面的限制同样生效。 传统 BlockExtension 在类上声明 static performanceSafe = true。

演出中的限制

调用演出段进行中的行为
ctx.flow.callFragment()被拒绝:控制台告警,不调用片段,Promise 直接正常结束,不抛错
ctx.flow.unsafe_goToFragment()被拒绝:控制台告警,当前流程保持不变
ctx.dialogue.hideBox()不生效
ctx.flow.restart()允许
使用这组接口需要新版 SDK。老扩展先在程序开发界面「同步 SDK」,并把 extension.json 的 sdkVersion 声明为 >=3.0.0。需要兼容旧版 Studio 时,用 ctx.performance?.isActive() 这类可选链读取。