live2d-web ドキュメント

React

必要なコンポーネントでのみ React 連携を読み込みます。

Client Component で使う

/react は Client Component でのみ読み込んでください。Live2DCanvas が描画を管理し、Live2DModel がモデルの読み込みと画面から外れたときの破棄を行います。

'use client'
 
import { Live2DCanvas, Live2DModel } from 'live2d-web/react'
 
export function Avatar() {
  return (
    <Live2DCanvas coreUrl="/live2dcubismcore.min.js">
      <Live2DModel src="/models/model.model3.json" />
    </Live2DCanvas>
  )
}

Canvas のアクセシビリティ

意味のあるキャラクターは画像として説明し、装飾だけの Canvas は支援技術から 隠します。ライブラリは Canvas を自動的にキーボードフォーカスの対象にしません。 タップやモーションには通常の DOM ボタンも用意し、 prefers-reduced-motion ではアニメーションを抑えてください。

<Live2DCanvas
  accessibility={{
    label: '動く案内キャラクター',
    describedBy: 'avatar-help',
  }}
  coreUrl="/live2dcubismcore.min.js"
>
  <Live2DModel src="/models/model.model3.json" />
</Live2DCanvas>
 
<p id="avatar-help">下のモーションボタンに反応するキャラクターです。</p>
<button type="button" onClick={() => controller?.motion('TapBody', 0)}>
  あいさつを再生
</button>

情報を伝えない Canvas には accessibility={{ mode: 'decorative' }} を使います。

準備後の controller を使う

モデル配下のコンポーネントで useLive2DModel() を呼び、ユーザー操作からコマンドを実行します。準備前は null で、unmount 後の controller は再利用できません。

import { useLive2DModel } from 'live2d-web/react'
 
function MotionButton() {
  const controller = useLive2DModel()
  return <button disabled={!controller} onClick={() => controller?.motion('TapBody', 0)}>あいさつを再生</button>
}
 
<Live2DModel src="/models/model.model3.json"><MotionButton /></Live2DModel>

Strict Mode と再試行

開発時の React Strict Mode では mount と cleanup が繰り返されます。controller をグローバルに保存せず、Live2DCanvasLive2DModel にリソースを所有させてください。モデル変更時はモデル ID を key に使います。