Chapter 48

◽ よく行う処理のライブラリ化

ポコ太郎
ポコ太郎
2022.01.18に更新

関数ライブラリとマクロライブラリ

ツールを作っていくと、普段よく行う処理が出てきます。そんな場合に UE では処理をライブラリ化する選択肢として「関数ライブラリ」と「マクロライブラリ」が用意されています。

利用の際の注意点はこちらにまとまっています。関数とライブラリの違いについても、分かりやすいスライドへのリンクが最初に紹介されています。

https://historia.co.jp/archives/6411/

しかし‥

残念ながら「関数ライブラリ」と「マクロライブラリ(親クラスは AssetActionUtility で試した)」では『Editor Utility Widget』用の関数が使えなかったりします。確認したものだと、例えば「📘 Execute Python Script」はどちらでも使えないようです。

代替案

これが良い案なのかは分かりませんが『Editor Utility Blueprint』を1つ関数ライブラリ用として作成し、他の『Editor Utility Widget』で使う‥といったことはできました。

ライブラリ用の BP を作成

Editor Utility Blueprint』を新規作成して、アセットを操作するものであれば親クラスを「AssetActionUtility」にします。ここでは「EUB_Library」と名付けました。

関数を作成してカテゴリ登録

BP を開いたら関数を作成します。

検索時に分かりやすいよう、関数をカテゴリ登録しておきましょう。「MyTools|FunctionLibrary」のようにバーティカルバー「|」で区切れば階層も作れます。

Enter を押してカテゴリを決定すると「FUNCTIONS」内で階層が確認できます。

関数の中身を作成

せっかく「📘 Execute Python Script」が使えるので使ってみましょう。関数の「INPUTS」に String 型の入力「text」を追加して「📘 Execute Python Script」にも入力「text」を追加し「Python Script」内で受け取った文字列をログに表示します。

コンパイルして保存すれば、これでライブラリ内に汎用関数が1つ用意できました。

関数を使ってみる

それでは別途『Editor Utility Widget』を作成して(名前は適当)、エディタを開き 🧱 ボタンを1つ追加して 📕 On Clicked イベントを追加します。

メニューから「Windows > Palette」を表示します。

先ほど登録したカテゴリ内に、先ほど作成した関数が見つかるのでグラフ内に追加します。

イベントと接続して「Text」内に出力したい文字列を追加してコンパイルするとエラーが出ます。

「Target」を右クリックして「Promote to Variable(変数に昇格)」を選びます。

すると関数の主である EUB_Library 型の変数が作られます。

変数名は「MyLibrary」に変えました。コンパイルするとエラーが消えますが‥

起動してボタンを押すとログに「Accessed None trying to read property MyLibrary(プロパティ MyLibrary を読み込もうとすると None にアクセスした)」と表示されます。これは変数「MyLibrary」の中身に何もセットしておらず空っぽの状態だからです。

そこで「Construct Object from Class(クラスからオブジェクトを構成)」を追加します。これは Class を指定してインスタンスを生成する(いわゆるNew)になるようです。

入力「Class」は作成したライブラリ用の BP を選択します。

入力「Outer」には「Get a reference to self」を追加して繋ぎます。

これで別の BP の関数を利用する準備が整いました。コンパイルして実行します。

ようやく無事に関数を利用することができました。

変数にセットして何度も呼び出せるようにする

途中の工程で作った変数「MyLibrary」は不要になったのでしょうか?

いえ、関数ライブラリを何度もグラフ内で利用するのであれば、インスタンスを SET しておいて何度も呼び出せるようにすると便利です。変数一覧からドラッグ&ドロップして SET を繋ぎます。

関数を呼ぶ度にインスタンスを作る必要はないので、このように変数「MyLibrary」に代入しておけば、以降は呼び出したい関数の「Target」に繋ぐだけでOKです。

特に『Editor Utility Widget』の場合、まず「📕 Pre Construct」でツール起動と同時にインスタンスを作成しておいて、ボタンクリックイベント等で変数「MyLibrary」を使えば良い感じです。

これでツールのライブラリ化が捗りますね!