Skip to content

模型事件

114 words
1 min

通过模型实例的 on 方法来监听模型事件.

生命周期

从调用 load() 到调用 destroy(),模型会经历以下生命周期,每个阶段都有对应的事件可以监听:

L2D 生命周期

事件列表

以下列出了所有的模型事件列表, 以 motionstart 为例:

ts
l2d.load({
  path: 'https://model.hacxy.cn/shizuku/shizuku.model.json',
});

l2d.on('motionstart', (group, index, duration, file) => {
  message.info(`动作开始: ${group}[${index}]${file ? ` - ${file}` : ''}${duration !== null ? ` (${duration}ms)` : ''}`);
});

tap

tap: (areaName: string) => void

用户点击 canvas 且命中 hit area 时触发,areaName 为命中的区域名称

参数:

参数名类型
areaNamestring

返回值类型: void

案例:

ts
l2d.load({
  path: 'https://model.hacxy.cn/shizuku/shizuku.model.json',
});

l2d.on('tap', areaName => {
  message.info(`点击区域: ${areaName}`);
});

loadstart

loadstart: (total: number) => void

调用 load() 后,模型文件开始下载前触发,total 为需要加载的文件总数

参数:

参数名类型
totalnumber

返回值类型: void

案例:

ts
l2d.on('loadstart', total => {
  message.info(`开始加载,共 ${total} 个文件`);
});

l2d.load({
  path: 'https://model.hacxy.cn/cat-black/model.json',
});

loadprogress

loadprogress: (loaded: number, total: number, file: string) => void

每个文件下载完成时触发

参数:

参数名类型
loadednumber
totalnumber
filestring

返回值类型: void

案例:

ts
let progressMsg: ReturnType<typeof message.loading> | null = null;

l2d.on('loadprogress', (loaded, total, file) => {
  const filename = file.split('/').pop() || file;
  if (!progressMsg) {
    progressMsg = message.loading(`${loaded}/${total}  ${filename}`, { duration: 0 });
  }
  else {
    progressMsg.content = `${loaded}/${total}  ${filename}`;
  }
});

l2d.on('loaded', () => {
  progressMsg?.destroy();
});

l2d.load({
  path: 'https://model.hacxy.cn/cat-black/model.json',
});

loaded

loaded: () => void

所有资源下载完毕、模型初始化完成并开始首帧渲染时触发

返回值类型: void

案例:

ts
l2d.on('loaded', () => {
  message.success('模型加载完成,开始渲染');
});

l2d.load({
  path: 'https://model.hacxy.cn/cat-black/model.json',
});

expressionstart

expressionstart: (id: string) => void

调用 setExpression() 后,表情过渡动画开始播放时触发,id 为表情 ID

参数:

参数名类型
idstring

返回值类型: void

案例:

ts
l2d.on('expressionstart', id => {
  message.info(`表情开始播放: ${id}`);
});

l2d.load({
  path: 'https://model.hacxy.cn/shizuku/shizuku.model.json',
}).then(() => {
  const [first] = l2d.getExpressions();
  if (first)
    l2d.setExpression(first);
});

expressionend

expressionend: () => void

表情过渡动画播放结束时触发

返回值类型: void

案例:

ts
l2d.on('expressionend', () => {
  message.info('表情播放结束');
});

l2d.load({
  path: 'https://model.hacxy.cn/shizuku/shizuku.model.json',
}).then(() => {
  const [first] = l2d.getExpressions();
  if (first)
    l2d.setExpression(first);
});

motionstart

motionstart: (group: string, index: number, duration: number | null, file: string | null) => void

调用 playMotion() 或随机动作被触发后,动作开始播放时触发

参数:

参数名类型
groupstring
indexnumber
durationnumber | null
filestring | null

返回值类型: void

案例:

ts
l2d.load({
  path: 'https://model.hacxy.cn/shizuku/shizuku.model.json',
});

l2d.on('motionstart', (group, index, duration, file) => {
  message.info(`动作开始: ${group}[${index}]${file ? ` - ${file}` : ''}${duration !== null ? ` (${duration}ms)` : ''}`);
});

motionend

motionend: (group: string, index: number, file: string | null) => void

当前动作播放完毕时触发

参数:

参数名类型
groupstring
indexnumber
filestring | null

返回值类型: void

案例:

ts
l2d.on('motionend', (group, index, file) => {
  message.info(`动作结束: ${group}[${index}]${file ? ` - ${file}` : ''}`);
});

l2d.load({
  path: 'https://model.hacxy.cn/shizuku/shizuku.model.json',
});

destroy

destroy: () => void

调用 destroy() 后,WebGL 资源释放完成时触发

返回值类型: void

案例:

ts
l2d.on('destroy', () => {
  message.info('模型已销毁,WebGL 资源释放完成');
});

l2d.load({
  path: 'https://model.hacxy.cn/cat-black/model.json',
});

MIT Licensed