🔖

[UE5]ソフト参照とハード参照を理解しよう

に公開

結論::ハード参照には気を付けよう

そのSetは今必要なのか??

見切れてしまっていますが、よくある形のSetMaterialです。

おそらくこの記事を読んでいる方なら説明不要かと存じますが、MeshのMaterialSlot0に
適当なMaterialをSetしているだけの簡単なBPです。

今回は「Set_Type_Weapon_Material」というイベントをベースに進めます。
このイベントはステージに入った瞬間、最初の一回だけ呼ばれる関数だと思ってください。
絶対に2回以上呼ばないという前提で進めます。

先に述べてしまうと、この書き方だと
「これを書いたBPActorが読み込まれた時点で4つのMaterialが読み込まれます」

ハード参照なんです

UEの仕様で、AssetのSet系(MaterialやTexture,BPActor等)を上記のように書くと、
書いたBPActorが読み込まれた瞬間に依存関係としてまとめて読み込まれてしまいます。

なのでSwitch文のうち1つしか用がなくとも無駄に3つ読み込んでしまいます。
今回は単純なMaterialなので被害はほぼ皆無なのですが、
「PaperZD」とかを用いてFlipbookをSetしていた場合、
まとめて読み込まれるので一気にメモリ使用率が跳ね上がって不足で破滅します。(1敗)

ソフト参照に変えよう

じゃあどうすればいいんだということで書き換えてみます。

一気に長くなってしまったのでアレルギーが出た方がいるかもしれませんが、
これが解決策です。

順を追って。

①変数ソフトオブジェクト参照の存在

気にしたことがない方もいると思いますが変数を作るときに下の画面出ますよね。

今回重要なのは、

オブジェクト参照
ソフトオブジェクト参照

これの違いです。

デフォルトで変数を作るとオブジェクト参照になります。
これは指定したAssetをその名の通り参照します。つまり前述の通りハード参照への道が開けます。

対してソフトオブジェクト参照は、今回の場合
「指定したMaterialが存在する場所のパスのみを保存する」
挙動となります。

つまりSetした段階ではパスしか知らないのでそのままSetすることができません。
そのかわりパスだけなので、この段階では参照がありません。
これが非常に重要です。

②Load Asset Blockingノード

見慣れないノードですがソフト参照BPではよく見ることになります。
端的に説明すると

ソフト参照で指定したアセットを今この瞬間に同期的にロードし返してくれて完了するまでスレッドを待機させる

ノードとなります。

ここが本体です。
パスを指定してこのノードが呼ばれたら、そのパス先Assetをロードします。
つまり、ここで初めてロードが走ります!!!!

注意点

Load Asset Blockingノードの説明で気が付いたかもしれませんが、
これは毎フレーム呼ぶとスレッドを待機させてしまう性質上、とんでもなく厄介な種になります。

なので、これの使いどころは例えばLevelに入った瞬間だけスキンを適応させるなどの
「多少待ちが発生しても、無駄な読み込みを減らしたい」
場所に限ります。

Beginで3600枚のTextureを読み込むと破滅しますので皆様、どうぞお気をつけて……

Discussion