JavaScript
React に依存しない基本 API を使います。
作成・読み込み・破棄
JavaScript API は1つの Canvas を管理します。モデルを操作する前に読み込みの完了を待ち、画面から外すときは必ず dispose() を呼んでください。
import { createLive2D } from 'live2d-web'
const character = await createLive2D({
container: document.querySelector('#avatar'),
coreUrl: '/live2dcubismcore.min.js',
src: '/models/model.model3.json',
})
await character.motion('TapBody', 0)
// When the host view is removed:
character.dispose()モデルを複数置く
addModel() は同じキャンバスにもう一つモデルを読み込みます。2体目のキャラクターが
2つ目の WebGL コンテキストではなくモデル1つで済みます。ブラウザーはコンテキスト数に
上限があります。
const stage = await createLive2D({
container: document.querySelector('#stage')!,
coreUrl: '/live2dcubismcore.min.js',
src: '/models/host.model3.json',
})
const guest = await stage.addModel({
src: '/models/guest.model3.json',
fit: { scale: 0.8, offsetX: 0.3, units: 'stage' },
})
await guest.motion('Tap', 0)
guest.dispose()追加した順に描画されるので、あとから足したモデルが上に来ます。モデルごとに fit、
モーション、表情、パラメーター、ヒットエリアを持ち、1つを破棄してもキャンバスと
残りはそのままです。src は任意で、省くと空のキャンバスから始めて addModel() で
埋められます。
インスタンスの motion() や fit などはそのまま残り、src で作ったモデルを
指します。配置オーバーレイは一度に1つのモデルだけが持ちます。
Canvas のアクセシビリティ
Canvas を支援技術に公開する必要がある場合だけ意味を指定します。オプションを 省略すると、従来のマークアップを維持します。
const character = await createLive2D({
accessibility: {
label: '動く案内キャラクター',
fallbackText: '案内キャラクターのイラスト',
},
container: document.querySelector('#avatar'),
src: '/models/model.model3.json',
})情報を伝えないモデルには { mode: 'decorative' } を使います。タップや
モーションはキーボードで操作できる通常の DOM ボタンやコントロールでも提供してください。
ランタイムは Canvas に tabIndex や role="application" を自動追加しません。
画面のライフサイクルに合わせる
インスタンスはコンテナーを所有する画面で保持します。非表示タブで描画が不要なら一時停止し、画面を外すときに破棄します。dispose() は複数回呼んでも安全です。
const onVisibility = () => document.hidden ? character.pause() : character.resume()
document.addEventListener('visibilitychange', onVisibility)
window.addEventListener('pagehide', () => {
document.removeEventListener('visibilitychange', onVisibility)
character.dispose()
}, { once: true })Vue、Svelte、その他のフレームワーク
専用のエントリーがあるのは React だけです。コンポーネントツリーには、ライフサイクルフックには不要な手当てが要るからです。React は Strict Mode で effect を2回実行し、並行してレンダリングし、後始末の時期を自分で決めます。ほかのフレームワークでは、命令型 API がそのままバインディングになります。マウント時にインスタンスを作り、アンマウント時に破棄し、その間はフレームワークが呼ぶところのローカルな状態に持たせてください。
<script setup lang="ts">
import { createLive2D } from 'live2d-web'
import { onBeforeUnmount, onMounted, ref } from 'vue'
const host = ref<HTMLElement>()
let character: Awaited<ReturnType<typeof createLive2D>> | undefined
onMounted(async () => {
character = await createLive2D({
container: host.value!,
coreUrl: '/live2dcubismcore.min.js',
src: '/models/model.model3.json',
})
})
onBeforeUnmount(() => character?.dispose())
</script>
<template>
<div ref="host" />
</template>Vue Vite の例に一式があります。Svelte や Solid もライフサイクルの名前が違うだけで、形は同じです。
通常の DOM で操作と再試行を用意
モーション、表情、再試行は Canvas 外のボタンで提供します。準備前は無効にし、失敗時は Live2DError.code を表示して、Core、アセット、WebGL の原因を修正してから再作成します。