足元に円錐をトグル表示する

作成日: 2026-05-21  |  カテゴリ: Protoflux / Slots / Local User

T キーを押すたびに自分の足元に円錐を出現・消滅させる トグルスイッチ の作り方を解説する。 Key Press Event / Is Null / If / Duplicate Slot / Destroy Slot / ValueField<Slot> / Body Node Slot の組み合わせ。 あわせて Local User がマルチユーザー環境でどう振る舞うか、 および 生成オブジェクトの同期 vs ローカル化 の考え方を図解する。

1. 事前準備

スクリプトを組む前にシーン上に以下を用意しておく。

準備するもの詳細
円錐テンプレ Slot シーンの非表示 Slot に置いた円錐オブジェクト。Duplicate Slot のコピー元になる。Active = false にしておくか、Duplicate 直後に有効化する。
ValueField<Slot> コンポーネント 現在表示中の円錐 Slot を記憶する変数。初期値 = null。「円錐が存在するか否か」の判定にも使う。
ValueField<Slot> はインスペクタで Slot 型の変数として作成できる。Protoflux の Read/Write ノードで参照する。

2. グラフ全体図 (SVG 再現)

Key Press Event T Events / Input Pressed Read ValueField<Slot> currentCone Variables Is Null Slots bool If Condition In True False Duplicate Slot Slots template Slot Write ValueField<Slot> currentCone Set Global Position Slots / Transform position Destroy Slot Slots target Write ValueField<Slot> (null を書く) 足元中点の座標計算 Local User Core Body Node Slot LeftFoot Body Nodes Body Node Slot RightFoot Get Global Position Get Global Position + / 2
図 A. トグルフロー全体図。上パス=円錐生成、下パス=円錐破棄、下部=足元座標計算

グラフの読み方

3. ノード別解説

Key Press Event

指定キー (ここでは T) が押されたときに実行フローを流すイベントノード。Pressed 出力が If ノードへのトリガーになる。

Read ValueField<Slot>

currentCone 変数の現在値 (Slot または null) を読み取る。Is Null の入力と Destroy Slot の target に同時に繋ぐ。

Is Null

入力 Slot が null かどうかを bool で返す。currentCone が null = 円錐未生成 → True。

If

Condition が True なら True 出力のフローを実行、False なら False 出力を実行。ここでは「生成 or 破棄」を分岐させる。

Duplicate Slot

指定 Slot とその子孫を複製して返す。テンプレート円錐 Slot を渡すと同一形状のコピーが生成される。

Write ValueField<Slot>

currentCone 変数に値を書き込む。生成パスでは複製 Slot を書き込む。破棄パスでは null を書き込んで変数をリセットする。

Body Node Slot

Local User の指定部位 (LeftFoot / RightFoot) の Slot を返す。この Slot の Global Position が足元座標の源泉になる。

Get Global Position

Slot のワールド座標 (float3) を返す。LeftFoot と RightFoot それぞれに適用して 2 点座標を取得する。

+ と / 2

2 つの float3 を足して 2 で割る = 両足の中点座標を計算。これを Set Global Position に渡すと円錐が両足の中央に配置される。

Set Global Position

対象 Slot (複製した円錐) のワールド座標を指定値に設定する。Duplicate 直後に実行して足元に移動させる。

Destroy Slot

指定 Slot を削除する。currentCone (既存の円錐) を渡して消去する。破棄後に Write null で変数をリセットする。

4. Local User の挙動 (重要)

Local User ノードは そのグラフを実行しているクライアントの「自分」を返す。 同じ Protoflux グラフが全員のクライアントで動いているとき、 You / Alice / Bob はそれぞれのクライアント上で異なる User を Local User として受け取る。

同じ Protoflux グラフが 3 クライアントで実行されるとき You のクライアント Local User = You Body Node Slot You の足元 Slot 円錐が生成される位置 You の足元 Alice のクライアント Local User = Alice Body Node Slot Alice の足元 Slot 円錐が生成される位置 Alice の足元 Bob のクライアント Local User = Bob Body Node Slot Bob の足元 Slot 円錐が生成される位置 Bob の足元
図 B. 同じ Local User ノードが、各クライアントでは異なるユーザーを指す
Key Press Event と Local User の組み合わせ
Key Press Event も「そのクライアントで T を押した人」が発火源になる。 You が T を押すと You のクライアントでグラフが動き、You の Local User = You になる。 Alice が T を押したときは Alice のクライアントで動き、Local User = Alice になる。 結果として各自の足元に円錐が出る。

5. 生成オブジェクトの同期 vs Local Slot 化

Duplicate Slot で生成したオブジェクトは、デフォルトでは全員に見える同期オブジェクトになる。 You / Alice / Bob がそれぞれ T を押すと、3 本の円錐が全員のクライアントに見える状態になる。 自分にだけ見せたい場合は生成直後に Local Slot 化 が必要。

同期 Slot (デフォルト) Duplicate Slot 直後に何もしない場合 You の画面 You の円錐 Alice の円錐 Bob の円錐 Alice の画面 Bob の画面 全員に 3 本の円錐が見える Local Slot 化 生成後に Local User Space 配下へ移動させる場合 You の画面 自分の円錐のみ Alice の画面 自分の円錐のみ Bob の画面 自分の円錐のみ 各自の画面に自分の円錐だけが見える
図 C. 同期 Slot (全員に見える) vs Local Slot 化 (本人にだけ見える) の見え方の違い

Local Slot 化の実装方法

生成後の円錐 Slot を自分だけのローカル空間に移動させるには、以下のどちらかを使う。

方法ノード説明
Local User Root 配下に移す Set Parent Slot + Local User Slot Local User の Root Slot を親に設定する。ただしアバターの Slot 階層に依存するため、確実な親 Slot を確認する必要がある。
Local Space への移動 Get/Set Parent + LocalUserSpace ノード (存在すれば) ユーザーのローカル空間として機能する Slot を探してその配下に置く。実装はワールドの設計による。
注意: Local 化の安定した方法はワールド設計に依存する
Resonite ではユーザーごとの "Local Slot" を保証するノードが一意に定まらない場合がある。 確実にローカル化したいなら、ワールドオーナーがあらかじめ各ユーザー用のローカル Slot ツリーを用意しておく設計が安全。

6. 代替・応用パターン

パターン概要メリット / デメリット
Hips Y を地面に投影 Body Node Slot (Hips) の Global Position の Y を 0 (または地面 Y) に固定して足元近くに配置 足の IK が低い場合でも中心に近い位置に置ける。両足の中点より高精度ではないが計算が簡単
User Root を辿る Local User Slot → Get Parent Slot を繰り返してワールドルートを取得 ワールド構造に依存。アバタースワップで Slot 階層が変わると壊れる可能性がある
常時追従させる トグルではなく Update イベントで毎フレーム位置を更新 常に足元に張り付く演出が可能。Destroy は不要になる代わりに常時計算コストがかかる