アバターの特定部位の Slot を取得するパターン

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

Resonite Protoflux でアバターの特定部位 (Head / Hand / Hips 等) の Slot を取得する手法を 2 つ解説する。 (1) Body Node Slot ノードによる標準リグ部位の直接取得、 (2) Find Child By Name による自作 Slot の名前検索。 両者の使い分けと組み合わせパターンを図解で示す。

1. Body Node Slot ノードの基本パターン

Local UserBody Node Slot → Slot 出力 という 3 ノード構成がアバター部位取得の最もシンプルな形。 スクリーンショット(図 1)を SVG で再現したものが下図である。

Local User Users Core BodyNode Input Head << >> Core Body Node Slot Source Node Slot Body Nodes Display Slot: Head Parent: Neck Core 取得した Slot は Head ボーンの Slot Parent が Neck であることを確認できる
図 1. Local User + BodyNode Input (Head) → Body Node Slot → Slot 出力の基本パターン

各ノードの役割

ノードカテゴリ入力出力役割
Local User Users なし User (紫) プログラムを実行中のローカルユーザーの User 型を返す
BodyNode Input Core 列挙値選択 UI BodyNode 列挙値 Head / Chest / Hips 等の部位を列挙で選択して出力する定数ノード
Body Node Slot Body Nodes Source: User
Node: BodyNode
Slot (黄緑) 指定ユーザーの指定部位に対応する Slot を返す

BodyNode 列挙値の一覧 (主要なもの)

対応部位用途例
HeadHUD 追従、視線方向の取得
Neck首の回転でジェスチャー判定
Chest胸部の向きで前後判定
Hipsルート座標・移動追跡
LeftHand左手ジェスチャー・IK
RightHand右手ジェスチャー・IK
LeftFoot左足フットワーク検出
RightFoot右足フットワーク検出
出力 Slot の意味
Body Node Slot が返す Slot は、そのボーン自体の Slot である。 Display に示されるように Slot: Head / Parent: Neck となっており、 Head ボーンの Slot の親が Neck であることが分かる。 これを使って Get Local PositionGet Global Position に接続すれば ボーン位置をワールド座標で取得できる。

2. Find Child By Name によるアバタールートスロット取得

Local User SlotFind Child By NameGet Parent Slot というパターン。アバターオブジェクト内の自作 Slot を名前で検索したいときに使う。 スクリーンショット(図 2)の再現が下図。

Local User Slot Users Core string Input CenteredRoot Core int Input 1 Core Find Child By Name Instance Name MatchSubstring IgnoreCase SearchDepth Searching Get Parent Slot Instance Slots Slot アバタールートの 親 Slot を取得
図 2. Local User Slot → Find Child By Name "CenteredRoot" (depth 1) → Get Parent Slot

Find Child By Name の入力ピン詳細

入力ピン説明
InstanceSlot検索を開始する親 Slot (ここでは Local User の Slot)
Namestring探したい子 Slot の名前 (例: "CenteredRoot")
MatchSubstringbooltrue にすると名前の部分一致で検索
IgnoreCasebooltrue にすると大文字小文字を無視
SearchDepthint何階層まで潜って検索するか。1 = 直接の子のみ
Get Parent Slot を挟む理由
Local User Slot → Find Child By Name ("CenteredRoot") で取得される Slot は CenteredRoot 自体。 さらに Get Parent Slot を通すことで、CenteredRoot の親 Slot = アバターのルート Slot を得られる。 アバタースワップ後もルート Slot の参照が安定するため、この迂回パターンがよく使われる。

3. アバター Slot 階層ツリー

Resonite のアバターは以下のような Slot 階層を持つ (標準的なヒューマノイドリグの例)。 Body Node Slot ノードが返す Slot がこのツリーのどこに位置するかを把握しておくと、 Parent / Children の操作がしやすくなる。

Hips Spine Chest Neck Head BodyNode: Head Left Shoulder Left Upper Arm Left Lower Arm Left Hand BodyNode: LeftHand Right Shoulder Right Upper Arm Right Lower Arm Right Hand BodyNode: RightHand Left Thigh → Left Leg → Left Foot Right Thigh → Right Leg → Right Foot BodyNode で取得可能な主要部位 中間ボーン (BodyNode なし)
図 3. アバターの標準 Slot 階層 (ヒューマノイドリグ簡略図)。緑枠が BodyNode で直接取得できる部位

4. Body Node Slot vs Find Child By Name — 使い分けフロー

Slot を取得したい 標準リグ部位 (Head/Hand/Hips 等)? YES NO (自作 Slot) Body Node Slot Source = Local User Node = BodyNode 列挙値 ※ アバター非依存で安定 Find Child By Name Instance = User Slot Name = "自作 Slot 名" SearchDepth = 探索深さ ※ Slot 名変更で壊れる Slot を取得 Head, LeftHand 等の ボーン Slot が直接得られる Parent は一つ上のボーン 子 Slot を取得 CenteredRoot 等の 自作 Slot が得られる Get Parent Slot でルートへ遡れる 組み合わせ: Head Slot 配下の自作 Slot を名前で探す 取得対象が分かったら手法を選ぶ
図 4. Body Node Slot vs Find Child By Name の使い分けフローと組み合わせパターン

5. 組み合わせパターン: Head 配下の自作 Slot を探す

よくある応用として「Head ボーンの Slot を Body Node Slot で取得してから、 その子 Slot の中で "CenteredRoot" という名前の Slot を Find Child By Name で探す」がある。

Local User
  → Body Node Slot (Node = Head)      # Head ボーン Slot を取得
    → Find Child By Name (Name = "CenteredRoot", Depth = 3)
      → [目的の Slot]

この方法は、アバター全体を Slot ツリーの根から検索するよりも 検索範囲を Head 以下に絞れるため高速・安全である。

6. Local User 以外のユーザーへの対応

別のユーザーの部位 Slot を取得したい場合は、Source に渡す User を切り替える。

取得したい User使うノード補足
自分自身 Local User 実行中ユーザーを返す。最も確実
ワールド内の誰かひとり Get Active User インタラクト対象の User を返すことが多い
リスト中の特定ユーザー Get User / Users ノード ユーザー名や ID からルックアップ

7. ユースケース

用途取得する Slotノード構成
頭追従 HUD Head Slot Body Node Slot (Head) → HUD オブジェクトの位置を同期
手の位置でジェスチャー判定 LeftHand / RightHand Slot Body Node Slot → Get Global Position → 座標比較
IK ターゲットの追従 Head / Hand / Foot Body Node Slot → IK Target 用 Slot の Position に書き込み
アバタースワップ後も壊れない参照 CenteredRoot の親 Slot Find Child By Name + Get Parent Slot で毎回動的解決
腰の高さで座り判定 Hips Slot Body Node Slot (Hips) → Get Global Position.Y と閾値比較

8. 注意点

null Slot に注意
Body Node Slot は、アバターがそのボーンを持っていない場合 (非ヒューマノイドアバター等) に null を返すことがある。Is Null Slot ノードで null チェックをしてから使うこと。
BodyNode 列挙値は列挙型 (enum)
BodyNode Input ノードで値を選択する際、接続先は BodyNode 型のピンでなければならない。 誤って intstring のピンに接続しようとするとコネクションが張れない。
権限: 他ユーザーの Slot は読み取りのみ
他ユーザーの Body Node Slot から取得した Slot の 位置読み取り は可能だが、 そのユーザーの所有オブジェクトへの書き込みは権限が必要。 自分のオブジェクトの位置を他ユーザーの Head に同期させる形で実装するのが安全。
Find Child By Name は Slot 名に依存する
Slot の名前が変わると参照が壊れる。アバターの Slot 名はアバター作者が決めるため、 他人のアバターへの汎用適用には Body Node Slot の方が堅牢である。

9. 実機スクショで見る — Body Node Slot パターン

以下は実際の Resonite Protoflux エディタのスクリーンショット。各ノードカードを切り抜いて解説する。

Body Node Slot パターン全体のスクリーンショット

クリックで原寸表示

Local User ノードのスクリーンショット
ノード 1
Local User

このグラフを実行しているローカルユーザー自身を User 型で返す。 出力ピン (紫の "Users" バー) を Body Node Slot の Source に接続する。 誰がトリガーしても「その人自身」を指すため、マルチユーザー環境で安定して動作する。

BodyNode Input Head のスクリーンショット
ノード 2
BodyNode Input — Head

取得したいボーン部位を列挙値 (enum) で選択する定数ノード。 スクショでは Head が選択されている。 「<< >>」ボタンで値をスクロール切り替えできる。 出力は BodyNode 型で、Body Node Slot の Node ピンに接続する。

Body Node Slot ノードのスクリーンショット
ノード 3
Body Node Slot

Source (User) と Node (BodyNode 列挙値) の 2 入力を受け取り、 対応するボーンの Slot を出力する。 スクショでは紫ワイヤ (User) と黄緑ワイヤ (BodyNode) が接続されており、 出力 (右端の黄緑ピン) を Display または他ノードへ渡す。

Display ノード — Slot: Head, Parent: Neck のスクリーンショット
確認用
Display — 結果確認

Body Node Slot の出力を Display ノードに繋いだ結果。 Slot: Head — 取得できた Slot の名前が Head であることを示す。 Parent: Neck — この Slot の親が Neck ボーンであることを示す。 アバターの Slot 階層通り (Neck → Head) になっている。

10. 実機スクショで見る — Find Child By Name パターン (応用)

Find Child By Name パターン全体のスクリーンショット

クリックで原寸表示

Local User Slot ノードのスクリーンショット
ノード 1
Local User Slot

Local User の Slot (アバターのルート近辺) を直接返すノード。 Local UserUser 型を返すのに対し、 こちらは Slot 型を返す点が異なる。 Find Child By Name の Instance (検索開始点) として使う。

string Input CenteredRoot と int Input 1 のスクリーンショット
ノード 2 & 3
string Input / int Input

string Input: "CenteredRoot" — 検索する子 Slot の名前を文字列で指定。 int Input: 1 — SearchDepth=1 なので直接の子 Slot のみを探索 (孫以下は見ない)。 深く探索するほど負荷が上がるため、必要最小限の深さに絞るのがベストプラクティス。

Find Child By Name ノードのスクリーンショット
ノード 4
Find Child By Name

Instance (親 Slot) から Name が一致する子 Slot を探索する。 入力ピンは上から: Instance / Name (赤) / MatchSubstring / IgnoreCase / SearchDepth (緑)。 スクショで緑ワイヤ (int=1) が SearchDepth に接続されているのが確認できる。

Get Parent Slot ノードのスクリーンショット
ノード 5
Get Parent Slot

Find Child By Name で得た "CenteredRoot" Slot の 親 Slot を取得する。 これによりアバターのルート Slot に辿り着く。 アバタースワップ後も "CenteredRoot" という名前が維持される場合、 この迂回パターンはスワップに対して堅牢な参照を提供する。