Local User → Body Node Slot → Slot 出力 という 3 ノード構成がアバター部位取得の最もシンプルな形。 スクリーンショット(図 1)を SVG で再現したものが下図である。
| ノード | カテゴリ | 入力 | 出力 | 役割 |
|---|---|---|---|---|
| Local User | Users | なし | User (紫) | プログラムを実行中のローカルユーザーの User 型を返す |
| BodyNode Input | Core | 列挙値選択 UI | BodyNode 列挙値 | Head / Chest / Hips 等の部位を列挙で選択して出力する定数ノード |
| Body Node Slot | Body Nodes | Source: User Node: BodyNode |
Slot (黄緑) | 指定ユーザーの指定部位に対応する Slot を返す |
| 値 | 対応部位 | 用途例 |
|---|---|---|
Head | 頭 | HUD 追従、視線方向の取得 |
Neck | 首 | 首の回転でジェスチャー判定 |
Chest | 胸 | 胸部の向きで前後判定 |
Hips | 腰 | ルート座標・移動追跡 |
LeftHand | 左手 | ジェスチャー・IK |
RightHand | 右手 | ジェスチャー・IK |
LeftFoot | 左足 | フットワーク検出 |
RightFoot | 右足 | フットワーク検出 |
Slot: Head / Parent: Neck となっており、
Head ボーンの Slot の親が Neck であることが分かる。
これを使って Get Local Position や Get Global Position に接続すれば
ボーン位置をワールド座標で取得できる。
Local User Slot → Find Child By Name → Get Parent Slot というパターン。アバターオブジェクト内の自作 Slot を名前で検索したいときに使う。 スクリーンショット(図 2)の再現が下図。
| 入力ピン | 型 | 説明 |
|---|---|---|
| Instance | Slot | 検索を開始する親 Slot (ここでは Local User の Slot) |
| Name | string | 探したい子 Slot の名前 (例: "CenteredRoot") |
| MatchSubstring | bool | true にすると名前の部分一致で検索 |
| IgnoreCase | bool | true にすると大文字小文字を無視 |
| SearchDepth | int | 何階層まで潜って検索するか。1 = 直接の子のみ |
CenteredRoot 自体。
さらに Get Parent Slot を通すことで、CenteredRoot の親 Slot = アバターのルート Slot を得られる。
アバタースワップ後もルート Slot の参照が安定するため、この迂回パターンがよく使われる。
Resonite のアバターは以下のような Slot 階層を持つ (標準的なヒューマノイドリグの例)。 Body Node Slot ノードが返す Slot がこのツリーのどこに位置するかを把握しておくと、 Parent / Children の操作がしやすくなる。
よくある応用として「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 以下に絞れるため高速・安全である。
別のユーザーの部位 Slot を取得したい場合は、Source に渡す User を切り替える。
| 取得したい User | 使うノード | 補足 |
|---|---|---|
| 自分自身 | Local User | 実行中ユーザーを返す。最も確実 |
| ワールド内の誰かひとり | Get Active User | インタラクト対象の User を返すことが多い |
| リスト中の特定ユーザー | Get User / Users ノード | ユーザー名や ID からルックアップ |
| 用途 | 取得する 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 と閾値比較 |
BodyNode 型のピンでなければならない。
誤って int や string のピンに接続しようとするとコネクションが張れない。
以下は実際の Resonite Protoflux エディタのスクリーンショット。各ノードカードを切り抜いて解説する。
クリックで原寸表示
このグラフを実行しているローカルユーザー自身を User 型で返す。
出力ピン (紫の "Users" バー) を Body Node Slot の Source に接続する。
誰がトリガーしても「その人自身」を指すため、マルチユーザー環境で安定して動作する。
取得したいボーン部位を列挙値 (enum) で選択する定数ノード。
スクショでは Head が選択されている。
「<< >>」ボタンで値をスクロール切り替えできる。
出力は BodyNode 型で、Body Node Slot の Node ピンに接続する。
Source (User) と Node (BodyNode 列挙値) の 2 入力を受け取り、
対応するボーンの Slot を出力する。
スクショでは紫ワイヤ (User) と黄緑ワイヤ (BodyNode) が接続されており、
出力 (右端の黄緑ピン) を Display または他ノードへ渡す。
Body Node Slot の出力を Display ノードに繋いだ結果。 Slot: Head — 取得できた Slot の名前が Head であることを示す。 Parent: Neck — この Slot の親が Neck ボーンであることを示す。 アバターの Slot 階層通り (Neck → Head) になっている。
クリックで原寸表示
Local User の Slot (アバターのルート近辺) を直接返すノード。
Local User が User 型を返すのに対し、
こちらは Slot 型を返す点が異なる。
Find Child By Name の Instance (検索開始点) として使う。
string Input: "CenteredRoot" — 検索する子 Slot の名前を文字列で指定。 int Input: 1 — SearchDepth=1 なので直接の子 Slot のみを探索 (孫以下は見ない)。 深く探索するほど負荷が上がるため、必要最小限の深さに絞るのがベストプラクティス。
Instance (親 Slot) から Name が一致する子 Slot を探索する。 入力ピンは上から: Instance / Name (赤) / MatchSubstring / IgnoreCase / SearchDepth (緑)。 スクショで緑ワイヤ (int=1) が SearchDepth に接続されているのが確認できる。
Find Child By Name で得た "CenteredRoot" Slot の 親 Slot を取得する。 これによりアバターのルート Slot に辿り着く。 アバタースワップ後も "CenteredRoot" という名前が維持される場合、 この迂回パターンはスワップに対して堅牢な参照を提供する。