PerryのUEFN/UE5雑記メモ

UEFN/UE5に関する情報を発信していきます。https://twitter.com/home

コントロールリグのノード一覧・解説【UE5】

 



前提

この記事はUdemyの講座を受講しながら、登場したノードをまとめたものです。
現在受講途中のため随時更新します。
*2025/2/2現在 進捗率100%

講中の講座
Control Rig for Unreal Engine 5

www.udemy.com

ノード一覧

Forward Solve

イベントのスタート地点
このノード以降に接続したノードが実行される

Forward Solve

 

Construction Event

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

Construction Event

四則演算(Add , Subtract , Multiply , Divide)

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

四則演算

Modulo

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

Modulo

Get Transform

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

Get Transform

Set Transform

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

Set Transform


For Each

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

For Each

At

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

At

Set At

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

Set At

To World

リグノード内のトランスフォームはすべてリグ空間内のトランスフォームであるためそれをワールド空間に変換する
リグ空間(グローバル空間とも言われる)→ワールド空間へ変換

Valueへの入力が何もない場合はすべて0の入力をワールド空間へ変換する

To World

From World

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

From World

Draw Transform

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

Draw Transform

Draw Line

入力Aと入力Bの間にデバッグ用のラインを描画する
CokorでRGBAを指定して色を変えられる
Thicknessで描画するラインの太さを変えられる

レベル上での描画にはデバッグコマンドが必要

・描画デバックコマンド

ctrlキーを押してコマンド欄を出して
a.animnode.controlrig.debug 1
UE5.3以降の場合は
ControlRig.EnableDrawInterfaceInGame 1

Draw Line

Basic IK

2つのボーンの位置関係を調整する
・Item A → Item B → Effector Item
の順にボーンの階層を設定
(上腕→下腕→手首のように)

・Primary Axis
最上部の骨(ItemA)が次の骨(ItemB)に向いている向き(方向)を入力
・Secondary Axis
最上部の骨(ItemA)からみてPole Vectorがある向き(方向)を入力
・Pole Vector
IKソルバに使用する極座標
(上腕→下腕→手首の例で言うと肘のある位置)

Basic IK


Compute Pole Vector

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

Compute Pole Vector

Full Body IK

Rootで設定したボーンを
Effecttorsで指定したボーンに基づいて調整する

詳細は公式ドキュメントを参照

dev.epicgames.com

Full Body IK

Aim

指定したボーンをターゲットを向くように回転させる
人の頭を目標物を追いかけるように動かすときなどに使う

・Primary
追いかけて欲しいものを入力
-Axis
ボーンのターゲットに向けて、向いて欲しい軸を入力
-Target
目標となるものの位置

・Secondary
ボーンの狙いの副次的ターゲット(基本的には上方向)を入力
-Axis
ボーンの上方向(ワールド空間におけるZ軸)を向いている軸を入力
-Target
ボーンの上方向(ワールド空間におけるZ軸)の上空の座標を入力

・Weight
動きの重み付け
値を小さくすると動きが小さくなる

Aim

Inverse

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

Inverse

Delta Time

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

Delta Time

Interpolate

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

Interpolate

Spring Interpolate

バネ補間
CurrrentとTarget値の間を補間する
・Strength
バネの強さ
・CriticalDamping
スプリング減衰の量
デフォルト値は1
1より小さくすると到達してから安定するまでの時間が短くなる(バネのように弾む)
1より大きくなるとターゲットに到達する時間が長くなる

バネのような補間ということで、バネと同じように縮むにつれて張力は弱まるので段々移動量は小さくなる?(多分)

Spring Interpolate

Print

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

Print

Branch

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

Branch

If

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

If

Less

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

Less

Greater

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

Greater

Clamp

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

Clamp


Maximum , Minimum

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

Maximum , Minimum

Scale

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

Scale

Length

ベクトルの長さを返す

Length

Curve

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

Curve

右クリック時メニュー

Evaluate Curve

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

Evaluate Curve

 

例)カーブで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の範囲を出た際に、上限・下限を超えないようになる

Remap

グラフ

Sphere Trace By Channel

StartからEndまでの間の空間で当たり判定の検出を行い、最初に当たり判定を検出した位置をHit Locationから返す

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

Sphere Trace By Channel

Noise

MinimumとMaximunの間でノイズのある揺らぎを返す
Speedの揺らぎの速度を設定
ValueとFrequencyは正常に機能していなよう(UE5.3)

最小値と最大値の間を往復しつつ、その値にノイズを加えて有機的な動きに見えるようになっているイメージ
Sin波(正弦波)で往復を作ると綺麗な動きすぎて生物の挙動に使うには規則正しすぎるのでノイズを混ぜて自然な動きとして使ったりできる

Noise

Time Offset (Value Over Time)

右クリックからノードを出すときはTime Offsetで検索すると出てくる
Valueを接続すると名前がValue Over Timeに変わる

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

Time Offset

Value Over Time

From Euler

オイラー角をクオータニオン角に変換する

クオータニオン角についてはこちらを参照

 

もっと詳しい解説している方の記事

qiita.com

Frim Euler

To Euler

クオータニオン角をオイラー角へ変換する

To Euler



Rotate Vector

入力したベクタークオータニオンで回転させる

Rotate Vector

DeltaFromPrevious

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

DeltaFromPrevious

Item Chain

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

Item Chain


Num

配列の要素の数を返す

Num

Absolute

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

Absolute

Distance Between , Angle Between

AからBまでの距離、角度を返す

Distance Between , Angle Between





Tips

コントロールの位置を変更する

コントロールの位置は移動してもコンパイルすると初期位置にリセットされてしまう
位置を固定するには

画面左下のリグ階層タブ

コントロールを右クリック

現在からOffsetトランスフォームを設定

これでコンパイルしても位置がリセットされなくなる

説明

 

【レベルシーケンス】アクタのトランスフォームをベイクする方法【UEFN】

■前提

レベルシーケンスではカメラリグレールなどのパスに沿ってアクタを移動させることができます。

本記事では
パスに沿ってアクタを動かす方法と
パスに沿って動いているアクタのトランスフォームをキーフレームに変換する(ベイクトランスフォームする)方法を解説します。


再現性は確認できていませんが、カメラリグレールのパス上を動かしているアクタにプレイヤーが接触すると意図しない挙動になってしまうバグが発生したのでこの方法で解決しました。

 

■レールに沿ってアクタを動かす

<カメラリグレールの出し方>
アクタ配置パネル>シネマティック>CameraRigRail

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


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

これで動画のようにレールに沿ってアクタが動いてくれます。
後からレールの形状を変更してもレール上を動いてくれるので便利です。
また、キーフレームを追加して動きの緩急をつけることも出来ます。

www.youtube.com

 

■ベイクトランスフォームの方法

シーケンサー上でアクタを選択>上部のレンチ🔧マーク>ベイクトランスフォーム


開始フレーム/終了フレーム
ベイクする範囲を選択します。
今回はシーケンサー全体を選択

キー設定をベイク
AllFramesを選択します。

その他の項目
キーの削減や許容範囲を設定することでベイクするフレームを削減できます。
デフォルトでは1フレームごとのトランスフォームをベイクします。

今回はこの設定は変更しません。

最後に不要になったCameraRigRailとパスを削除します。


■作業手順とベイク結果

youtu.be

■筆者

https://x.com/perrymotovlog


XでUEFNやUEの情報発信しています。

【レベルシーケンス】フォートナイトにおける可動性の違いによる慣性挙動の検証【UEFN】

■前提

レベルシーケンスで動かしたものに乗っているときの プレイヤーに働く慣性の法則が気になったので検証してみました。 アスレチックスのマップなんかは特にゲームの手触りに関わってくるので注意が必要です。

検証の動画は以下のポスト参照

 

 

■要点

検証する設定項目は以下の2点

●スタティックメッシュの設定が 「ムーバブル」「スタティック」

●親子付けされた「親」「子」


①ムーバブル 親
②ムーバブル 子
③スタティック 親
④スタティック 子
⑤小道具移動装置

それぞれ同様の動く床のシーケンスを作成した上でジャンプ。ジャンプ中に移動の入力は行わないものとする。

 

■結論

「親」の上でジャンプすると慣性の法則が働いている
「子」の上でジャンプすると慣性なし

⚠️注意点
シーケンスが再生中でないレベルシーケンスに登録されているムーバブルの親

上記の3条件がそろった小道具に接触した際に はるか彼方まで吹き飛ばされることがある(ポスト2つめの動画)

 

■余談

一般に動きをつけているものは「ムーバブル」の設定がいいと言われている。
●親子付けの必要があり、「親」にプレイヤーが接触する可能性がある場合は例外的に「スタティック」にする必要がある スタティックメッシュの可動性の設定の詳しいことは熟知していないので間違っている場合があります。 フォートナイトの既存の小道具の可動性を変更するには 詳細パネル>ヒエラルキーのStaticMeshComponent>可動性 で変更できます。

ポストしていた上記の件の追記
「スタティック」設定のアクタでもシーケンサーの中では自動的に「ムーバブル」の設定に上書きされているようです。
なのでシーケンスに登録するアクタの可動性の設定は「スタティック」にしておくのが無難なようです。


■筆者

https://x.com/perrymotovlog
XでUEFNの検証やUEの情報発信しています。

Verseでデバイスのイベントを連携する方法【ごろ助塾】

■前提

この記事はごろ助さん(https://x.com/GorosukeUEFN)の好意により開催しているごろ助塾で学んだことのメモです。 今回はVerse編第二回「Verse上でイベントバインディングを行う」という内容でした。
基本的なデバイスの参照の方法と個人的に躓いた点を記載します。

■ゴール設定

ボタンを押し、スイッチの状態が"オン"の場合にはHUDメッセージを表示する。 ボタンを押し、スイッチの状態が"オフ"の場合にはHUDメッセージを非表示にする。

youtu.be

■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の情報発信を行っています。
x.com

サブシーケンスをループさせる方法

■前提

サブシーケンスとは?

シネマティックシーケンスにおいて、作成したシーケンスを別のシーケンス内に組み込んで再生することができます。


事前に作成したカットシーンや、細かな動きを作成しておいて、後ほどまとめて再生することができます。


■サブシーケンスの作成

シーケンサーの「+追加」から

サブシーケンスを追加してシーケンスを指定する。


■サブシーケンスループさせる方法

初期設定のままでは設定したサブシーケンスが終了した時点で停止してしまいます。

 

ループさせる方法は

①サブシーケンスをタイムライン上で右クリック

②プロパティを選択

③「CanLoop」にチェックをいれる

④サブシーケンスの右端をクリックしながらループさせたいところまでドラッグさせる

 

これでサブシーケンスがループするようになります。

UEFNプロジェクトの復元方法【OneDriveによるエラー】

■前提

4月22日、突然ローカルファイルに保存されているUEFNプロジェクトとUEFNエディターの接続が切れてしまいました。
今回はその対処方法の一例を紹介します。

*おそらくWindowsのアップデートの影響でOneDriveの設定が変更されたことによると思われます。
UEFNではOneDrive管理下のフォルダにUEFNプロジェクトを保存することを推奨されていません、OneDrive管理外のフォルダに保存するようにしましょう。


■症状

通常、下記画像のように既存のプロジェクトを開くときは
右下に「開く」という項目があり、プロジェクトを開いていると思います。

しかし、

当然ローカルファイルに保存されているはずのプロジェクトから「開く」の項目が消え

「同期」となっていました。

 

これは通常、リビジョンコントロール有効化されている場合に現れるものです。

 

つまりUEFNがローカル上のファイルを認識していないということで、

この記事ではその対処方法、ローカルファイルの読み込みの方法を解説します。

 



*リビジョンコントロールとは共同編集やチームで制作しているプロジェクトなどに利用される機能でサーバー上でプロジェクトを管理することができます。

リビジョンコントロールの詳細↓

dev.epicgames.com


 

■対処方法

ここで「同期」を選択してしまうと、サーバー上のリビジョンコントロールに保存されているデータを読み込んでしまうので、リビジョンコントロールを正しく使えていない場合や、最新状態をチェックインしていない場合、プロジェクトが巻き戻ってしまい、最悪の場合、初期状態に戻ってしまいます。

①「ブラウズ」を選択

②ローカルファイルから「〇〇(プロジェクト名).uefnproject」を探して
自分の場合Windows(C:) > UEFN > 〇〇(プロジェクト名)にありました。

③「開く」を押す

④UEFNのセキュリティから作成者を信頼しますか?と聞かれるので

「はい、作成者を信頼します」を選択
この場合作成者は自分自身なので信頼して問題ありません。

これで今後から、今まで通りUEFNからローカルファイルを読み込み出来るようになります。



■まとめ

プロジェクトが開けなくなると焦ってしまいますが、落ち着いてローカルファイルを再度読み込んでプロジェクトを取り戻しましょう!