avatar-animations について
Decentraland のシーン制作者向けに、プレイヤーアバターのアニメーション制作を案内するスキルです。既存のエモートを先に調べ、必要な場合は Blender での制作、検証、書き出し、受け渡しを支援します。
主な機能
- 01既存エモートとアセットパックを先に確認
- 02Blenderでの制作手順
- 03ポーズ、貫通、範囲の検証
- 04emote GLBの書き出しと検証
- 05シーンへのアニメーション受け渡し
活用シーン
- 01シーンに合う既存アバター動作の検索
- 02特定の小道具に合わせたアニメーション制作
- 03ポーズ、床、貫通問題の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ decentraland/ sdk-skills --skill avatar-animationsインストール後、Claude Code で/avatar-animationsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/animation-catalog.mdavatar-rig.mdblender-emote-patterns.mdembedded-emotes.md詳細
アバターアニメーション(シーンエモート)の作成
このスキルでは、アニメーションファイルの作成について説明します。Blenderで公式Decentralandアバターリグにポーズを付け、クリップを*_emote.glbとしてエクスポートして検証し、シーンに引き渡します。再生に使うシーン側のAPI(triggerSceneEmote、stopEmote、AvatarEmoteCommand、AvatarMask enum、権限)はplayer-avatarにあります。このスキルでは繰り返さず、そちらを参照します。
ルール:作成する前に既存のアニメーションを探す
ユーザーからアバターアニメーションを求められたら、以下を順に確認し、最初に適合するものが見つかった時点で終了します。作成は最後の手段であり、最初に選ぶ方法ではありません。
- 組み込みエモート — 名前で再生できる32個のID(
triggerEmote({ predefinedEmote })、またはAvatarShape.expressionTriggerId)があり、ダウンロードは不要です。手を振る、拍手、ダンス、座るポーズ(ループ)、ボタン/レバー/ドア/チェストの操作、パンチ、投げる動作などがあります。アニメーション付きプレビューを含むカタログは{baseDir}/references/animation-catalog.md§1、ループフラグと埋め込み専用の5つのIDは{baseDir}/references/embedded-emotes.mdにあります。 - Avatar Animationsアセットパック — すぐに使える45個の
_emote.glbクリップがあります(スツール、クッション、ビーズクッション、縁に座る動作、チェス、釣り一式、運ぶ、拾う、飲む、クラフト、水やり、殴る、剣、魔法、飛ぶ、踊るなど)。{baseDir}/references/animation-catalog.md§2には、再生時間、ダウンロード、triggerSceneEmoteの呼び出し方法を含む全項目があります。動きを確認するにはpreview:のwebpを取得してください。 - カスタムクリップ — 上記に該当するものがない場合、またはユーザーが独自のものを明示的に希望する場合に限ります。以下のBlenderワークフローを使います。
どの方法を選んだか、またその理由を伝えてください。通常、組み込みクリップやアセットパックのクリップは手作業で作成したものより自然に見え、数時間ではなく数分で用意できます。ただし、特定の小道具やシーンの形状に合わせたポーズには、カスタムクリップが適しています。
開始前のスコープ確認:
| ユーザーの要望 | スキル |
|---|---|
| あらゆる種類のアバターアニメーション — まずカタログを確認 | このスキル → references/animation-catalog.md(組み込み、次にアセットパック)、その後、再生にはplayer-avatar |
| カタログにない、プレイヤーのアバター用の新しいアニメーション | このスキル(Blenderワークフロー) |
組み込みエモート、または既存の_emote.glbの再生 | player-avatar |
.glbモデル/小道具にベイクされたアニメーションクリップの再生 | animations-tweens |
| NPCのアニメーション | npcs |
| エンティティの手続き的な移動/回転 | animations-tweens(Tween) |
ワークフロー
- リグを取得する — 手作りのアーマチュアは使わず、
Avatar_File.blendを使います。ダウンロード先とボーン/コントロール/プロパティのリファレンスは{baseDir}/references/avatar-rig.mdにあります。 - セットアップする — シーンを30 fpsに設定します(配布ファイルは24 fpsです)。
Starting_Poseの値を記録し、クリップごとに新しいアクションを1つ作成します。 - 作成する — Poseモードで
CTRL_ボーンのみをポーズ設定し、触れたすべてのボーンについて、すべてのキーフレームでキーを設定します。 - 作成中に検証する — ワールド座標を出力して(クリッピング、床、アニメーション領域を)確認し、各キーフレームを4方向からレンダリングしてコンタクトシートにします。
- エクスポートする — 1ファイルにつき1クリップ、アーマチュアのみ、
export_def_bones=True、ACTIVE_ACTIONSを指定します。 - GLBを検証する — JSONチャンクを解析し、アニメーションが1つ、メッシュが0個、ノードが63個、パスごとのチャンネルが62個、再生時間が
(frames − 1) / 30であることを確認します。 - 引き渡す — ファイル名を
*_emote.glbに変更し、assets/animations/以下に配置して、権限を追加し、再生します(player-avatarを参照)。
各手順にすぐ使えるbpyヘルパー(ヘルパーモジュール、サイン検出、レンダー/コンタクトシートのセットアップ、エクスポート呼び出し、GLB検証ツール)は、{baseDir}/references/blender-emote-patterns.mdにあります。
Blenderの操作方法(ヘッドレスCLIとBlender MCPの使い分け、バイナリのパス、MCPからヘッドレスへ黙って切り替えてはならないというルール)は、すでに{baseDir}/../add-3d-models/references/blender-authoring.mdで説明されています。エモートの作成でも同じ2つの方法を使います。方法を一から導き出さないでください。
ルール:クリップごとに新しいアクションを作成し、アイドルポーズに戻します。初期姿勢には戻しません
クリップごとに新しいアクションを作成します。Blender 4.4+/5 のアクションはスロット式であり、Action.fcurves は存在しなくなりました(カーブは act.layers[0].strips[0].channelbags の下にあります)。
act = bpy.data.actions.new(name)
slot = act.slots.new('OBJECT', 'Avatar_Animation')
arm.animation_data.action = act
arm.animation_data.action_slot = slot
何かを作成する前に、scene.frame_set(0) を実行して Starting_Pose を評価し、すべてのポーズボーンのトランスフォームを記録します。このスナップショットが、キー間でリセットする際の基準になります。初期姿勢のトランスフォームではありません。アーマチュアのレストポーズは A/T ポーズですが、ランタイムでブレンドされるアイドル状態は Starting_Pose です。初期姿勢にリセットすると、クリップの最初のフレームで T ポーズに切り替わってしまいます。
ルール:ポーズを付けたものはすべて、各キーフレームでキーを設定します
scene.frame_set() はアクティブなアクションを再評価し、キーを設定していないポーズを上書きします(view_layer.update() では上書きされません)。キーを設定し忘れたポーズの frame_set 後にレンダリングすると、気付かないうちにアイドル状態が表示され、誤った箇所をデバッグすることになります。そのため、触れたすべてのコントロールボーンについて、位置、回転、スケールのキーを挿入し、変更したカスタムプロパティにもキーを設定します。
pb.keyframe_insert('["FK > IK Leg L"]', frame=f)
最初と最後のフレームでは、すべての変形ボーンについても位置/回転/スケールのキーを設定します。境界キーのないチャンネルは「オープン」状態のままになり、以前に再生したエモートの値が残ります。公式ドキュメントではこれをエモートオーバーライドと呼んでおり、最後に再生したエモートの動きが脚に残ったアバターとして現れます。
ルール:上腕は、方向にはワールド軸を使い、ひねりにはローカル Y を使います
上腕ボーンのローカル X は傾いています。この軸を中心に回転させると腕が胸の前を横切るように動き、両腕を前に出すはずのポーズが腕を交差させた状態になります。これは実際に起きる現象で、正面からのレンダリングでは分かりにくいものです。そのため、まずワールド軸をボーンの現在の座標系に変換してから、腕の方向を設定します。
M = (arm.matrix_world @ pb.matrix).to_3x3().normalized()
local_axis = M.inverted() @ Vector(world_axis)
pb.rotation_quaternion @= Quaternion(local_axis, math.radians(deg))
- 真っすぐ前に上げる → ワールド X。
- 上げた腕を内側/外側に動かす → ワールド Z を中心にヨー回転。
ただし、ワールド軸だけでは完璧な腕のポーズにはなりません。腕はさまざまな方向に動き、リグのアニメーターはワールド回転とローカル回転の両方を組み合わせて使います。ボーンのローカル軸が必要なのは次の 2 つです。
- ひねり — 手のひらを上/下に向ける、肘を外/内に向ける、小道具に向ける必要がある手首などは、ボーンの長軸を中心に回転させる必要があります。このリグではそれがローカル Yです(確認済み:
CTRL_FK_Avatar_Arm.*のローカル Y はボーン軸です。これを回転させても肘の位置は変わらず、前腕と手だけが回転します)。rl('CTRL_FK_Avatar_Arm.L', 'Y', deg)。 - 細かな調整 — 大まかな方向が決まったら、別のワールド軸回転を加えるより、小さなローカル補正のほうが正確な場合があります。
肘、膝、手首、指はローカル Xを軸に曲がります(これらのコントロールでは Y/Z はロックされています)。その場合は rl() が正しい方法です。
ルール:脚は左右反転しますが、上半身は反転しません。貼り付けた上半身は X と Z を反転して修正します
Blender の Pose ▸ Copy Pose / Paste X-Flipped は、このリグの半分でしか機能しません(Avatar_File.blend で確認済み。数値は {baseDir}/references/avatar-rig.md を参照)。
- 脚と足は、FK でも IK でも通常どおり左右反転します — Paste X-Flipped は IK の脚では正確で、FK の脚でも約 3 cm 以内の誤差です。
- 肩、上腕、前腕、手、指は反転しません — Paste X-Flipped を使うと、反対側の手が 40~70 cm ずれた位置に配置されます。リグアニメーターによる修正方法は、貼り付けた上半身の各コントロールについて、X と Z の値を反転し、Y はそのままにすることです。例:貼り付けた腕の X が −0.5、Z が 0.1 の場合、X を 0.5、Z を −0.1 にします。回転(クォータニオンまたはオイラー角)に適用し、IK の手と肘のコントロールでは位置にも適用します。FK と IK の両方で、指の 30 個のコントロールすべてを含む腕のチェーン全体について、正確(0.000 m)であることを確認済みです。
{baseDir}/references/blender-emote-patterns.mdのmirror_side('L')は、すべてのコントロールに対して両方の手順を一度に実行します。- ミラーではなく単一の関節にポーズを付ける場合も、符号をプログラムで検出します。+15° 回転させ、下流のボーンがどちらに動いたかを測定してキャッシュします(
auto_sign)。.Lと.Rに同じ角度を指定しても、左右対称のポーズにはなりません。
ルール:FK か IK か — 接触がなくなるなら FK、接触を保つなら IK
脚はデフォルトで IK、腕は FK です(CTRL_Avatar_UpperBody の FK > IK * プロパティ)。ポーズに必要な場合にのみ、次のルールに従って切り替えてください。手や足が床、座席、壁、小道具に接触し続ける必要がある場合は IK、接触しなくなる場合は FK にします。
- FK の脚:ジャンプ、でんぐり返し、飛行、逆立ち、水泳、崖や劇場の座席からぶら下がる脚。
- IK の手:腕立て伏せ、登る動作、テーブルにもたれる動作、両手で1つの小道具を固定する動作。
- 歩行サイクル、ダンス、または接触が一時的にしか失われない動作では、モードを切り替えないでください。デフォルト設定で対応でき、切り替えると、フレームで2つのチェーンが完全に一致しない限り、ポーズが跳ねます。
- モードを変更するときは、ボーンだけでなく
FK > IKプロパティ自体にもキーを設定してください。
座るポーズ。 CTRL_Avatar_UpperBody で胴体を下げます。これは重心であり、全身を動かします。CTRL_Avatar_Hips が動かすのは骨盤と脚だけで、胴体が伸びてしまうため、座る動作には適していません。その後、脚ごとに判断します。
| 足 | 脚 |
|---|---|
| 両足が地面に着いている(椅子、ベンチ) | IK のままにします:CTRL_IK_Foot.* を足が着く位置に動かしてから、COG を下げます。膝は自動的に曲がり、足は地面に固定されたままです(検証済み:0.4 m 下げても、つま先の Z は 0 のままです)。CTRL_Avatar_Knee.* で膝の向きを調整します。 |
| 片脚をもう片方の脚に組む | 上げた脚だけを FK にし、地面に着いた脚は IK のままにします。 |
| 足が地面に着いていない(池の縁、劇場の座席、高いスツール) | 両脚を FK にします。 |
setprop('CTRL_Avatar_UpperBody', 'FK > IK Leg L', 0.0) # only for a leg that leaves the ground
setprop('CTRL_Avatar_UpperBody', 'FK > IK Leg R', 0.0)
# ...then pose CTRL_FK_Avatar_UpLeg / _Leg / _Foot / _ToeBase on that side
モードにかかわらず、足を確認してください。Avatar_LeftToeBase / Avatar_RightToeBase のワールド Z は ≥ 0 を保つ必要があります。そうでないと、アバターが床に沈み込みます。
ルール:レンダリングだけでなく、数値でも確認する
レンダリングでは構図を確認でき、数値ではクリッピングを確認できます。すべてのキーフレームで、手、頭、足、および小道具の基準点のワールド位置を出力してください。
- 手足が頭のそばを通るときは、手を頭の中心から 約 0.3 m 以上離してください。肩越しに投げる動作では、腕を先に外側へ回すまで頭蓋骨をまっすぐ突き抜けていました。
- 手が中心線上で重ならないように、手同士を 約 0.10 m 以上離してください。
- デフォルトのポーズや保持ポーズでは、顔が見えるようにしてください。物は顔の前ではなく、頭を下に傾けた状態で胸の上部の高さに保持します。
Workbech で各キーフレームを4方向(正面斜め、正面、側面、上面)からレンダリングし、1枚のコンタクトシートに並べてください。まず、低コストのポーズのみのステージ(実行あたり数秒)で反復し、その後にエクスポートを含むフルビルドを行います。
ルール:アニメーション領域内に収める
Avatar_File.blend の参照オブジェクトで測定(ワールド座標のメートル、Blender は Z 軸が上):
| 参照オブジェクト | 範囲 | 意味 |
|---|---|---|
Animation_Area_Reference | 4 × 4 × 4 m のボックス — X、Y ∈ [−2, 2]、Z ∈ [0, 4] | クリップ全体を通して、すべてをこの中に収めます。すべての身体パーツ、プロップ、パーティクルが対象です。どの方向にも 4 m を超えて移動してはいけません。 |
Root_Animation_Area | 原点を中心とする直径 2 m の円柱 | アバターのルート/重心(CTRL_Avatar_UpperBody、つまり Avatar_Hips)は、前後左右に最大 1 m 移動できます(全幅 2 m)。垂直方向はボックスの範囲内であれば上昇できます(ドキュメントでは 4 m と記載されていますが、ファイル内の円柱メッシュの高さは 3 m です)。 |
Ground_Reference | Z = 0 にある平面 | これより下に出てはいけません。 |
この範囲内であれば、クリップにルート移動を含めてもかまいません。身体全体が前に歩く、横に崩れ落ちる、床に沈み込むなどの動きも、Explorer はプレイヤーだけでなく AvatarShape NPC 上でも再生します(ワールド内で確認、Unity Explorer v0.186.0-alpha、SDK 7.30.1、2026-10-10)。Transform/Tween による移動ではエモートがキャンセルされるため、全身エモートの再生中に NPC を移動させるには、この方法しかありません(npcs)。
脚、腕、頭、プロップはルートの円柱からはみ出してもかまいません(キックや側転ではそのようになります)。ただし、ボックスの範囲内には収めてください。キーフレームごとのレポートに次のチェックを追加します:|hips.x| ≤ 1、|hips.y| ≤ 1、すべてのデフォームボーンのヘッドとテールがボックス内にあること、すべてのつま先で Z ≥ 0 であること({baseDir}/references/blender-emote-patterns.md の in_area())。Decentraland Tools アドオンの Validate Emote は、CTRL_Avatar_UpperBody が最初のフレームから水平方向または垂直方向に 1 m を超えて移動すると警告しますが、ボックス内かどうかはチェックしません。そのため、in_area() のチェックは自分で実行してください。
ルール:ループはつなぎ目なく、一回限りの動きはシーン再開時の姿勢に着地させる
- ループクリップ:最初と最後のキーフレームを同一にします(例:4 秒のループならフレーム 1 と 121)。そうしないとループ時に動きが跳ねます。
- 一回限りのクリップ:開始時と終了時の両方で、シーンが戻る休息姿勢を取ります。座った状態のゲームなら座って何かを持つ姿勢、それ以外なら
Starting_Poseです。
ルール:1 ファイルにつき 1 クリップのみを、アーマチュアだけで書き出す
最初に、ほかのオブジェクトをすべて削除します。メッシュ、WGT_* ウィジェット、参照平面、Armature_Prop、カメラ、ライトが対象です。さらに Starting_Pose アクションも削除してください。そうしないと、エクスポーターが 2 つのクリップを書き出します。ファイルにつきアニメーションを正確に 1 つにするには、export_animation_mode='ACTIVE_ACTIONS' を指定します。完全なエクスポート呼び出しは {baseDir}/references/blender-emote-patterns.md にあります。
後でユーザーがアクションを手作業で調整できるように、取り除く前にメッシュを含む編集可能な .blend を保存します。
ルール:受け渡す前に、書き出した GLB を検証する
GLB の JSON チャンクを解析して、次のことを確認します:アニメーション 1 つ、メッシュ 0 個、ノード 63 個(Armature + デフォームボーン 62 個)、スキン 1 つ、平行移動/回転/スケールそれぞれのチャンネルが62 個、および duration == (last_frame − first_frame) / 30。検証スクリプトは {baseDir}/references/blender-emote-patterns.md にあります。duration が一致しない場合、シーンの FPS が 30 ではありません。
export_frame_step=1 の場合、1~4 秒のクリップの一般的なファイルサイズは 70~110 KB です。3 MB の上限を大きく下回るため、通常はサンプリングステップを上げる必要はありません。
上半身(マスク適用)アニメーション
マスク付きエモートは別のファイル形式ではありません。トリガー時に mask: AvatarMask.AM_UPPER_BODY を指定して、同じ .glb を再生します(API と enum の詳細は player-avatar →「Emote masks」を参照)。変わるのは、何を作成するべきかです。
マスクが維持するボーン — Explorer の UpperBodyAvatarMask.mask アセットを基に確認済みです。
- アニメーション対象:
Avatar_Spine、_Spine1、_Spine2、両方の肩/腕/前腕/手、40 本すべての指のボーン、Avatar_Neck、Avatar_Head。 - 無視対象:
Avatar_Hipsと両脚(UpLeg/Leg/Foot/ToeBase)。これらには、そのフレームのロコモーション状態または別のエモートの動きがそのまま反映されます。
仕組みとしては、レンダラーが各 LateUpdate でクリップをサンプリングした後、非マスク対象のボーンのローカル位置と回転を、Animator がすでに生成したポーズから復元します(MaskedLegacyEmoteBlender)。そのため、次のようになります。
- マスク付きクリップの腰/ルートの動きは反映されません。
Avatar_Hipsはマスク対象外なので、アバターを座らせるためにCTRL_Avatar_UpperBodyで作成した下降動作は破棄されます。脚にはロコモーション状態(アイドル、歩行、走行)が表示されます。 - マスク付きクリップが別のエモートに重ねて再生されることはありません。 Explorer の
SceneMaskedEmoteSystemで確認済みです。ローカルプレイヤーでマスク付きエモートを開始すると、再生中の全身エモートは停止します。また、全身エモートを開始すると、マスク付きエモートはキャンセルされます。そのため、マスク付きクリップを椅子に座るエモートの上で再生することはできず、アバターは立ち上がります。重ねられるのはロコモーションだけです。マスクの用途は、プレイヤーが歩行、走行、アイドル状態のときに、持つ、抱える、応援するといった動作をさせることです。 - 座っているプレイヤーには、まず
sittingChair1/sittingGround1を確認してください。これらはループしてポーズを維持するため、追加作業は不要です(このスキル冒頭の埋め込みエモートに関する注記を参照)。独自に作成する場合は、リリース前にオーナーに腕と手を確認してもらってください。2026-10-12 に確認したところ、以下の IK で足を固定し、UpperBodyを下げる方法では、正しい座りポーズになりましたが腕の動きが不自然で、人間の目でしか気づけませんでした。 - 座っているプレイヤーには、クリップを全身再生してください。 すべてのクリップで下半身も座った状態にし(腰を下げ、FK で脚を曲げる)、マスクなしでトリガーします。クリップ終了時にループする座りクリップが引き継がれない場合は、シーン側で座るエモート(
triggerEmote({ predefinedEmote: 'sittingChair1' })または椅子独自のもの)を再生し直します。ループするアイドルクリップと同じ座りポーズに戻るワンショットなら、途切れることなくつながります。目に見える段差が生じるのは、内蔵の座りエモートとの高さの違いだけなので、腰の下げ幅を調整してください。 - マスク付きで使う場合でも、全身を作成してください。 不自然でない下半身を作れば、同じファイルをマスクなしでも使えます。マスクを使うかどうかはトリガー時に決めるものであり、ファイルの属性ではありません。
- ローカルプレイヤーのマスク付きエモートでは、
AvatarEmoteCommandのライフサイクルイベントは発行されません(player-avatar に記載)。そのため、シーン側で再生時間を管理する必要があります。フレーム数から正確に把握できるため、各クリップの再生時間をパスとともにシーン設定に保存してください。
見映えのよい座った状態で物を持つポーズの設計メモ:腰は約 0.6 m、手は胸の高さ、頭は手のほうへ傾けます。
上記のボーン一覧とブレンドの仕組みは、Explorer のソース(
MaskedLegacyEmoteBlender、SceneMaskedEmoteSystem、CharacterEmoteSystem、mainブランチ、2026-09)から確認しました。「マスク付きは全身エモートを停止する」というルールは、ゲーム内で座っているプレイヤーを使って確認済みです。enum の値と呼び出しシグネチャについては、出荷済みプロトコルに照らして検証された player-avatar を信頼してください。
ファイル要件
| 要件 | 値 | 出典 |
|---|---|---|
| フレームレート | 30 fps(Blender のデフォルトは 24) | docs |
| 最大長 | 10 s / 300 フレーム | docs |
| 形式 | .glb | docs |
| 最大ファイルサイズ | 3 MB | docs |
| サンプリングレート | デフォルトは 1。サイズを小さくするには 2 または 3 | docs |
| ファイルあたりのアニメーションクリップ数 | 厳密に 1 つ(Emotes 2.0 ではプロップのクリップを 1 つ追加できる場合があります。シーケンスには対応していません) | docs |
| ファイルの内容 | 変形するスケルトンとアニメーションのみ — メッシュ、コントロールボーン、カメラ、ライトは含めません | docs |
| 開始/終了ポーズ | どちらもアイドル状態(Starting_Pose)からのもの | docs |
| 変形ボーンのキー | すべてのボーンについて、最初と最後のフレームに位置+回転+スケール | docs |
| アニメーション領域 | ルートは水平方向の各軸で ≤ 1 m(合計 2 m)。すべてのメッシュパーツとプロップを Animation_Area_Reference の 4 × 4 × 4 m のボックス内に収めます(上記の RULE を参照) | docs + 実測 |
| ファイル名 | _emote.glb で終わる必要があります(大文字・小文字は区別されません) | player-avatar |
| シーンの権限 | scene.json の requiredPermissions に ALLOW_TO_TRIGGER_AVATAR_EMOTE を指定します | player-avatar |
シーン内での一般的な配置場所は assets/animations/ です。glTF アニメーションの 名前 はランタイムでは関係ありません。識別子となるのはファイルパスです。
Blender の glTF エクスポーター UI での同等の設定項目は、手動でエクスポートする場合、Include > Limit to > Visible Objects、Data > Armature > Export Deformation Bones Only、Animation > Sampling Animations です。
Decentraland Tools アドオンの Validate Emote オペレーターは、エクスポート前にこれらの大半(30 fps、≤ 300 フレーム、アーマチュアのアクションが厳密に 1 つ、変形チャンネルの最初と最後のフレームにキーがあること)をチェックします。また、COG が水平方向または垂直方向に 1 m を超えて移動すると警告しますが、エクスポートはブロックしません。4 m のバウンディングボックスはチェックしません。
シーン内でのテスト
最も手早いテスト用ハーネスは、クリック可能なプリミティブキューブを横一列に並べたものです。椅子からでもクリックできるよう maxDistance を大きめに設定した MeshRenderer + MeshCollider + pointerEventsSystem.onPointerDown を使い、クリップごとに 1 つずつ配置します。さらに Stop キューブとマスク切り替えキューブを追加します。
pointerEventsSystem.onPointerDown(
{ entity: cube, opts: { button: InputAction.IA_POINTER, hoverText: label, maxDistance } },
() => void triggerSceneEmote({ src, loop: false, mask: upperBody ? AvatarMask.AM_UPPER_BODY : undefined })
)
ハーネス全体を設定フラグで制御し、公開前に削除してください。
Explorer MCP の trigger_emote は URN/ベースのエモートのみを再生し、シーンファイルは再生しません — _emote.glb のテストには使用できません。シーン内のトリガーを使用してください(トリガー間でクライアントを移動させる方法については unity-explorer-mcp を参照)。
相互参照
- player-avatar —
triggerSceneEmote/stopEmote/AvatarEmoteCommand/AvatarMask、_emote.glbのルール、権限、および全身エモート中にInputModifierを使ってプレイヤーを停止させる方法。 - add-3d-models →
references/blender-authoring.md— Blender を操作する方法(ヘッドレス CLI と MCP のどちらを使うか)と、モデルの一般的なエクスポートルール。 - animations-tweens — プロップやモデルにベイクされたアニメーション、およびプロシージャルな
Tweenモーション。 - npcs —
AvatarShapeNPC と GLB NPC のアニメーション。 - 公式ドキュメント:エモートの作成 · リグの機能 · アバターリグ