コントロールリグのノード一覧・解説【UE5】
- 前提
- ノード一覧
- Forward Solve
- Construction Event
- 四則演算(Add , Subtract , Multiply , Divide)
- Modulo
- Get Transform
- Set Transform
- For Each
- At
- Set At
- To World
- From World
- Draw Transform
- Draw Line
- Basic IK
- Compute Pole Vector
- Full Body IK
- Aim
- Inverse
- Delta Time
- Interpolate
- Spring Interpolate
- Branch
- If
- Less
- Greater
- Clamp
- Maximum , Minimum
- Scale
- Length
- Curve
- Evaluate Curve
- Remap
- Sphere Trace By Channel
- Noise
- Time Offset (Value Over Time)
- From Euler
- To Euler
- Rotate Vector
- DeltaFromPrevious
- Item Chain
- Num
- Absolute
- Distance Between , Angle Between
- Tips
前提
この記事はUdemyの講座を受講しながら、登場したノードをまとめたものです。
現在受講途中のため随時更新します。
*2025/2/2現在 進捗率100%
受講中の講座
Control Rig for Unreal Engine 5
ノード一覧
Forward Solve
イベントのスタート地点
このノード以降に接続したノードが実行される

Construction Event
ワールドが生成されたときに一度だけ実行する
ForwardSolvehはフレームごとに実行される

四則演算(Add , Subtract , Multiply , Divide)
基本的な四則演算のノード
Add 加算(足し算)
Subtract 減算(引き算)
Multiply 乗算(掛け算)
Divide 除算(割り算)
AとBは同じ型の入力を入れる必要があるが、接続時に自動で変換してくれることも多い

Modulo
余り計算(Mod計算)
Aで受け取った値をBで割った余りを出力する
例)A=6.5 , B=3 の時 Resultは0.5になる

Get Transform
Nameで指定したボーンやコントロール(Typeで指定)のトランスフォームを取得する

Set Transform
Nameで指定したボーンやコントロール(Typeで指定)のトランスフォームを設定する
Propagate to ChildrenをTrueにすると階層の子どもにも影響を与える

For Each
配列内それぞれに対して実行する
Excudeの後は配列の要素ごとに実行
Completeの後はすべての処理が完了後に実行

At
配列からIndexで指定した位置にある要素を取り出す

Set At
配列の要素をIndexごとに設定する

To World
リグノード内のトランスフォームはすべてリグ空間内のトランスフォームであるためそれをワールド空間に変換する
リグ空間(グローバル空間とも言われる)→ワールド空間へ変換
Valueへの入力が何もない場合はすべて0の入力をワールド空間へ変換する

From World
To Worldの逆の機能
ワールド空間→リグ空間(グローバル空間とも言われる)へ変換

Draw Transform
デバッグ描画用ノード
トランスフォームを矢印やボックスで描画できる

Draw Line
入力Aと入力Bの間にデバッグ用のラインを描画する
CokorでRGBAを指定して色を変えられる
Thicknessで描画するラインの太さを変えられる
レベル上での描画にはデバッグコマンドが必要
・描画デバックコマンド
ctrlキーを押してコマンド欄を出して
a.animnode.controlrig.debug 1
UE5.3以降の場合は
ControlRig.EnableDrawInterfaceInGame 1

Basic IK
2つのボーンの位置関係を調整する
・Item A → Item B → Effector Item
の順にボーンの階層を設定
(上腕→下腕→手首のように)
・Primary Axis
最上部の骨(ItemA)が次の骨(ItemB)に向いている向き(方向)を入力
・Secondary Axis
最上部の骨(ItemA)からみてPole Vectorがある向き(方向)を入力
・Pole Vector
IKソルバに使用する極座標
(上腕→下腕→手首の例で言うと肘のある位置)

Compute Pole Vector
Basic IKで使用するPole Vectorの位置を自動計算する

Full Body IK
Rootで設定したボーンを
Effecttorsで指定したボーンに基づいて調整する
詳細は公式ドキュメントを参照

Aim
指定したボーンをターゲットを向くように回転させる
人の頭を目標物を追いかけるように動かすときなどに使う
・Primary
追いかけて欲しいものを入力
-Axis
ボーンのターゲットに向けて、向いて欲しい軸を入力
-Target
目標となるものの位置
・Secondary
ボーンの狙いの副次的ターゲット(基本的には上方向)を入力
-Axis
ボーンの上方向(ワールド空間におけるZ軸)を向いている軸を入力
-Target
ボーンの上方向(ワールド空間におけるZ軸)の上空の座標を入力
・Weight
動きの重み付け
値を小さくすると動きが小さくなる

Inverse
逆数を返す(受け取った値に-1をかける)

Delta Time
デルタ時間を取得する
デルタ時間とはフレーム間の差分の時間のこと
例)フレームレート100fpsでゲームが実行される場合、デルタ時間は1/100秒となる

Interpolate
AとBの間をTの値に応じて線形に補間する
Tは0~1の値をとる
例) A=0 , B=20 , T=0.5 のとき Return=10

Spring Interpolate
バネ補間
CurrrentとTarget値の間を補間する
・Strength
バネの強さ
・CriticalDamping
スプリング減衰の量
デフォルト値は1
1より小さくすると到達してから安定するまでの時間が短くなる(バネのように弾む)
1より大きくなるとターゲットに到達する時間が長くなる
バネのような補間ということで、バネと同じように縮むにつれて張力は弱まるので段々移動量は小さくなる?(多分)

任意の値(Valueへの入力)をログに出力する
ログは
プレビューシーン左上、シミュレーション中の画面左上、出力ログに表示される

Branch
条件(True,False)に応じて分岐を行う

If
条件(True,False)に応じて"値"を返す
Branchが条件に応じてイベントが分岐するのに対してIfでは返す値が違うことに注意

Less
AがBよりも小さいときTureを返す

Greater
AがBよりも大きいときTrueを返す

Clamp
Value(値)をMinimum(最小値)とMaximum(最大値)の間に固定する
例) Value=1.5 , Min=0 , Max=1.0のときResult=1.0

Maximum , Minimum
A,Bの入力のうち
Maximunは大きい方を返す
Minimumは小さい方を返す

Scale
Value(値)をFactorでScale(拡大縮小)する
実質入力の型が制限されたMultiplyのようなもの?

Length
ベクトルの長さを返す

Curve
カーブを作成する
グラフ上で右クリックしてキーフレームを追加
キーフレームを左クリックで値を変更
右クリックでキーフレームの補間タイプを変更できる


Evaluate Curve
カーブ(Carve)を評価(Evaluate)する
Valueで受け取った値に応じてResultを返す
Value=X軸(Souse)
Result=Y軸(Target)
下記画像のように

例)カーブでy=2xのグラフを作成してValueに0.5を与えたときResultは1.0となる

Remap
Valueで指定された値をSource範囲とTarget範囲に応じて再マッピングする
(x,y)=(SourceMinimum,TargetMinimum) (SourceMaximum,TargetMaximun)の
2座標を元にy=ax+bのグラフを作って
aにValueを代入したときの解をResultとして出力する
ClampをTrueにするとValueがSourceの範囲を出た際に、上限・下限を超えないようになる



Sphere Trace By Channel
StartからEndまでの間の空間で当たり判定の検出を行い、最初に当たり判定を検出した位置をHit Locationから返す
・インプット
Start トレース(検出)の開始位置
End トレース(検出)の終了位置
Trace Channnel どの当たり判定を検出するか(VisibilityとCameraの2種類がある)
Radius 判定に使う球体の半径
・アウトプット
Hit 当たり判定があったかどうかの真偽値を返す
Hit Location 当たり判定があった座標を返す
Hit Normal 当たり判定があった角度(法線)を返す

Noise
MinimumとMaximunの間でノイズのある揺らぎを返す
Speedの揺らぎの速度を設定
ValueとFrequencyは正常に機能していなよう(UE5.3)
最小値と最大値の間を往復しつつ、その値にノイズを加えて有機的な動きに見えるようになっているイメージ
Sin波(正弦波)で往復を作ると綺麗な動きすぎて生物の挙動に使うには規則正しすぎるのでノイズを混ぜて自然な動きとして使ったりできる

Time Offset (Value Over Time)
右クリックからノードを出すときはTime Offsetで検索すると出てくる
Valueを接続すると名前がValue Over Timeに変わる
時間を遅らせて値を出力する
・Second Ago
この入力値(秒)前の値を参照する
・Buffer Size
サンプリングの制度
数値が大きいほど精度は上がるがメモリ消費も大きくなる
・Time Range
オフセットに必要な最大時間(秒)
この値が大きくなると目的の値までゆっくり動くようになる


From Euler
オイラー角をクオータニオン角に変換する
クオータニオン角についてはこちらを参照
3D空間の角度についてまとめ
— Perry@UEFN Creator (@perrymotovlog) 2025年2月2日
オイラー角、クオータニオン角、ラジアン、デグリーと用語が混乱してきたので自分なりに整理します。ググって調べた知識なので誤り含みます。
まず
・ラジアンとデグリーは角度の「単位」
・オイラー角とクオータニオン角は角度の「表現方法」
「単位」
円の1周は… pic.twitter.com/ykp6mtEeNt
もっと詳しい解説している方の記事

To Euler

Rotate Vector

DeltaFromPrevious
このノードを通過する前と後の差を計算する

Item Chain
First ItemからLast Itemまでの配列を作成する

Num
配列の要素の数を返す

Absolute
受け取った値の絶対値を返す(負の数を正の数に変換する)

Distance Between , Angle Between
AからBまでの距離、角度を返す

Tips
コントロールの位置を変更する
コントロールの位置は移動してもコンパイルすると初期位置にリセットされてしまう
位置を固定するには
画面左下のリグ階層タブ
↓
コントロールを右クリック
↓
現在からOffsetトランスフォームを設定
これでコンパイルしても位置がリセットされなくなる

【レベルシーケンス】アクタのトランスフォームをベイクする方法【UEFN】
■前提
レベルシーケンスではカメラリグレールなどのパスに沿ってアクタを移動させることができます。
本記事では
パスに沿ってアクタを動かす方法と
パスに沿って動いているアクタのトランスフォームをキーフレームに変換する(ベイクトランスフォームする)方法を解説します。
再現性は確認できていませんが、カメラリグレールのパス上を動かしているアクタにプレイヤーが接触すると意図しない挙動になってしまうバグが発生したのでこの方法で解決しました。
■レールに沿ってアクタを動かす
<カメラリグレールの出し方>
アクタ配置パネル>シネマティック>CameraRigRail

好きな形にレールを配置する

<シーケンサー内でアクタとレールをバインディング>
動かしたいアクタをシーケンサーに登録>+ボタン>パス>新しいバインディング>任意のカメラリグレールを選択

これで動画のようにレールに沿ってアクタが動いてくれます。
後からレールの形状を変更してもレール上を動いてくれるので便利です。
また、キーフレームを追加して動きの緩急をつけることも出来ます。
■ベイクトランスフォームの方法
シーケンサー上でアクタを選択>上部のレンチ🔧マーク>ベイクトランスフォーム

開始フレーム/終了フレーム
ベイクする範囲を選択します。
今回はシーケンサー全体を選択
キー設定をベイク
AllFramesを選択します。
その他の項目
キーの削減や許容範囲を設定することでベイクするフレームを削減できます。
デフォルトでは1フレームごとのトランスフォームをベイクします。
今回はこの設定は変更しません。
最後に不要になったCameraRigRailとパスを削除します。

■作業手順とベイク結果
■筆者
XでUEFNやUEの情報発信しています。
【レベルシーケンス】フォートナイトにおける可動性の違いによる慣性挙動の検証【UEFN】
■前提
レベルシーケンスで動かしたものに乗っているときの プレイヤーに働く慣性の法則が気になったので検証してみました。 アスレチックスのマップなんかは特にゲームの手触りに関わってくるので注意が必要です。
検証の動画は以下のポスト参照
【慣性の検証】
— Perry@UEFN Creator (@perrymotovlog) 2024年6月4日
レベルシーケンスで動かしたものに乗っているときの
プレイヤーに働く慣性の法則が気になったので検証してみました。
アスレチックスのマップなんかは特にゲーム性に関わってくるので注意が必要です。
要点は2つ
●スタティックメッシュの設定が
「ムーバブル」か「スタティック」か… pic.twitter.com/pB5aMHFQNV
■要点
検証する設定項目は以下の2点
●スタティックメッシュの設定が 「ムーバブル」か「スタティック」か
●親子付けされた「親」か「子」か
①ムーバブル 親
②ムーバブル 子
③スタティック 親
④スタティック 子
⑤小道具移動装置
それぞれ同様の動く床のシーケンスを作成した上でジャンプ。ジャンプ中に移動の入力は行わないものとする。
■結論
「親」の上でジャンプすると慣性の法則が働いている
「子」の上でジャンプすると慣性なし
注意点
シーケンスが再生中でない&レベルシーケンスに登録されている&ムーバブルの親
上記の3条件がそろった小道具に接触した際に はるか彼方まで吹き飛ばされることがある(ポスト2つめの動画)
■余談
一般に動きをつけているものは「ムーバブル」の設定がいいと言われている。
●親子付けの必要があり、「親」にプレイヤーが接触する可能性がある場合は例外的に「スタティック」にする必要がある スタティックメッシュの可動性の設定の詳しいことは熟知していないので間違っている場合があります。 フォートナイトの既存の小道具の可動性を変更するには 詳細パネル>ヒエラルキーのStaticMeshComponent>可動性 で変更できます。
ポストしていた上記の件の追記
「スタティック」設定のアクタでもシーケンサーの中では自動的に「ムーバブル」の設定に上書きされているようです。
なのでシーケンスに登録するアクタの可動性の設定は「スタティック」にしておくのが無難なようです。
■筆者
https://x.com/perrymotovlog
XでUEFNの検証やUEの情報発信しています。
Verseでデバイスのイベントを連携する方法【ごろ助塾】
■前提
この記事はごろ助さん(https://x.com/GorosukeUEFN)の好意により開催しているごろ助塾で学んだことのメモです。 今回はVerse編第二回「Verse上でイベントバインディングを行う」という内容でした。
基本的なデバイスの参照の方法と個人的に躓いた点を記載します。
■ゴール設定
ボタンを押し、スイッチの状態が"オン"の場合にはHUDメッセージを表示する。 ボタンを押し、スイッチの状態が"オフ"の場合にはHUDメッセージを非表示にする。
■Verseデバイスでレベル上のデバイスを参照する
@editable
"任意の変数名" : "デバイス名" = "デバイス名"{}
@editable
Button : button_device = button_device{}
この例ではボタンデバイスに"Button"という名前をつけて参照できるようにしました。
■レベル上でデバイスを割り当てる
レベル上から任意のボタンデバイスを設定

■ボタンをインタラクトしたイベントをコード内で取得する(サブスクライブする)
"自分で決めた変数名".InteractedWithEvent.Subscribe("任意の関数名")
Button.InteractedWithEvent.Subscribe(OnInterantedButton)
■コード全体
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
switch_and_hud := class(creative_device):
@editable
Button : button_device = button_device{}
@editable
HUDMessageDevice : hud_message_device = hud_message_device{}
@editable
Switch : switch_device = switch_device{}
OnBegin():void=
Button.InteractedWithEvent.Subscribe(OnInterantedButton)
OnInterantedButton(Agent : agent):void=
if(Switch.GetCurrentState[]):
HUDMessageDevice.Show(Agent)
else:
HUDMessageDevice.Hide(Agent)
■個人的に躓いた点
スイッチデバイスの状態を確認する関数"GetCurrentState"について
なぜこれがIf分の中で実行されて条件分岐できるのか。
この関数は
スイッチの状態がONならvoidを返す
スイッチの状態がOFFなら何も返さない
つまり、ONの場合(返り値がある場合)はIf分が成功し以下のコードが実行される
OFFの場合(返り値がない場合)はIf文が失敗するため以下のコードが実行されない。

<decides>の指定子の有無でこれを見分けるとのこと
ムービーシーケンスでオーディオの再生位置を指定する方法【UEFN】
■前提
レベルシーケンスではオーディオを指定してシーケンスに合わせて音声を流すことができます。
デフォルトの設定ではシーケンスを再生しているプレイヤー全員に対して音声を再生します。
この記事では音声の再生位置をレベル上で指定して、指定した範囲のプレイヤーに音声を聞かせる方法を解説します。
また、距離による音量の減衰も指定できるのでより没入感のある体験を与えられます。
■方法
①「サウンド減衰」アセットの作成
コンテンツブラウザで右クリック>オーディオ>サウンド減衰
を選択してアセットを作成します。

②「サウンド減衰」の設定
・ボリューム減衰の有効化>✅true
・減衰関数>Liner
「Liner」は等倍的に音量の減衰が行われます
・減衰最短距離>10000
減衰を開始する距離です。
この距離以下の範囲は100%の音量で再生されます。
・フォールオフ距離>100000
減衰を終了する距離です。
「減衰最短距離」~「フォールオフ距離」の間で「等倍的(Liner)」に減衰します。
・空間化の有効化>✅ture

③シーケンサー内で音声の発生源を指定する
シーケンサーに追加したオーディオに対し「アタッチ」欄でオーディオの発生源を指定します。
これはレベル上のでアクタであればなんでもいいです。

④「サウンド減衰」アセットを割り当てる
オーディオのタイムラン上で右クリック>プロパティ>>アテニュエーション>
減衰オーバーライド>✅true
減衰設定>①②で作成したアセットを割り当てる。

■デバイスを使用する方法
本記事では割愛しますが、UEFNではオーディオの減衰設定をデバイスで設定することも出来ます。
「オーディオプレイヤーの仕掛け」などを用いることでデバイスから音を発生させることができます。
■執筆
XでもUEFN/UEの情報発信を行っています。
Tweets by perrymotovlo
x.com
サブシーケンスをループさせる方法
■前提
サブシーケンスとは?
シネマティックシーケンスにおいて、作成したシーケンスを別のシーケンス内に組み込んで再生することができます。
事前に作成したカットシーンや、細かな動きを作成しておいて、後ほどまとめて再生することができます。
■サブシーケンスの作成
シーケンサーの「+追加」から
サブシーケンスを追加してシーケンスを指定する。
■サブシーケンスループさせる方法
初期設定のままでは設定したサブシーケンスが終了した時点で停止してしまいます。
ループさせる方法は
①サブシーケンスをタイムライン上で右クリック
②プロパティを選択
③「CanLoop」にチェックをいれる
④サブシーケンスの右端をクリックしながらループさせたいところまでドラッグさせる

これでサブシーケンスがループするようになります。
UEFNプロジェクトの復元方法【OneDriveによるエラー】
■前提
4月22日、突然ローカルファイルに保存されているUEFNプロジェクトとUEFNエディターの接続が切れてしまいました。
今回はその対処方法の一例を紹介します。
*おそらくWindowsのアップデートの影響でOneDriveの設定が変更されたことによると思われます。
UEFNではOneDrive管理下のフォルダにUEFNプロジェクトを保存することを推奨されていません、OneDrive管理外のフォルダに保存するようにしましょう。
■症状
通常、下記画像のように既存のプロジェクトを開くときは
右下に「開く」という項目があり、プロジェクトを開いていると思います。

しかし、
当然ローカルファイルに保存されているはずのプロジェクトから「開く」の項目が消え
「同期」となっていました。

これは通常、リビジョンコントロール有効化されている場合に現れるものです。
つまりUEFNがローカル上のファイルを認識していないということで、
この記事ではその対処方法、ローカルファイルの読み込みの方法を解説します。
*リビジョンコントロールとは共同編集やチームで制作しているプロジェクトなどに利用される機能でサーバー上でプロジェクトを管理することができます。
リビジョンコントロールの詳細↓
■対処方法

ここで「同期」を選択してしまうと、サーバー上のリビジョンコントロールに保存されているデータを読み込んでしまうので、リビジョンコントロールを正しく使えていない場合や、最新状態をチェックインしていない場合、プロジェクトが巻き戻ってしまい、最悪の場合、初期状態に戻ってしまいます。
①「ブラウズ」を選択
②ローカルファイルから「〇〇(プロジェクト名).uefnproject」を探して
自分の場合Windows(C:) > UEFN > 〇〇(プロジェクト名)にありました。
③「開く」を押す

④UEFNのセキュリティから作成者を信頼しますか?と聞かれるので
「はい、作成者を信頼します」を選択
この場合作成者は自分自身なので信頼して問題ありません。

これで今後から、今まで通りUEFNからローカルファイルを読み込み出来るようになります。
■まとめ
プロジェクトが開けなくなると焦ってしまいますが、落ち着いてローカルファイルを再度読み込んでプロジェクトを取り戻しましょう!