執筆バージョン: Unreal Engine 5.0.0(EarlyAccess)
|
■はじめに
こんにちは、エンジニアの山中です。
今回は、お世話になっている方も多いであろう
エンジン提供のマクロ関数を
ちょっとだけカスタマイズしてみようと思います。
■カスタマイズする
今回カスタマイズするのは「WhileLoop」です。

皆さんお馴染みの「WhileLoop」
条件を満たす間、処理を繰り返したい場合に使用するマクロ関数です。
このマクロ関数を使用する上で最も注意すべきことは
条件の設定ミス、または想定外の処理フローによる
無限ループではないでしょうか。

100万回処理が続くと、無限ループとしてエンジン側の処理で検知
大体の場合、100万回処理を行う想定では使用しないと思いますし
瞬間的に負荷も掛かってしまいますので
最大でも、指定した回数分だけ処理を繰り返してくれる機能があれば便利そうです。
ということで今回はこの「WhileLoop」に回数制限を加えた
「LimitedLoop」を作成したいと思います。
①マクロライブラリを作成

コンテンツブラウザ上で右クリック→「Blueprints」→「Blueprint Macro Library」を選択

親クラスには「Object」を指定
アセット名は任意で変更していただいて構いません。
②マクロ関数の定義
先程作成したマクロライブラリを開いて、マクロ関数を定義していきます。

「MACROS」の追加ボタンからマクロ関数を新規追加し、名前を変更

入力ピンと出力ピンのベースは「WhileLoop」と一緒

入力ピンには新たに、回数制限を指定する為の「LimitCount」を追加 ※デフォルト値は一旦「100」に

出力ピンには新たに、回数制限に達した際に通る場所「Limited」を追加
マクロ関数の定義は以上になります。
外部から呼び出すとこんな感じに↓

制限回数はお好みで変更可能
③マクロ関数の実装
実装後の全体の処理は↓の通りになります。

「WhileLoop」の機能に回数制限を内包した実装
以下、細かい処理の実装を追っていきます。まずはローカル変数の定義です。
回数制限用の変数と、全体の継続状態用の変数を用意します。

上から順番に「処理回数を記録する変数」「処理回数による継続状態を記録する変数」「全体の継続状態を記録する変数」
次に初期化部分です。主にローカル変数の値の初期化を行っています。
処理の流れによって問題が発生しないよう、適切な値を設定します。

「処理回数」は『0』で初期化、「処理回数による継続状態」は『継続(true)』で初期化、「全体の継続状態」は『入力ピンの情報』で初期化
次に更新処理です。「LoopBody」の処理を実行する前に
継続状態の更新を行い、必要な情報を揃えます。

「処理回数が指定の回数に満たない場合」は処理回数による継続状態を『継続』、「【入力ピンの状態】+【回数制限】の両方の継続条件を満たしている場合」は全体の継続状態を『継続』
最後に実行ピンへの出力部分です。

継続条件を満たしている場合は処理回数を+1し、「LoopBody」へ進行

いずれかの継続条件を満たさない場合は処理は行わず、最終的に「Completed」「Limited」のどちらかに分岐
④実際に使ってみた
まず、LimitCountを「10」に設定し、
Conditionを「false」にして、ノードを実行してみます。


通常の「WhileLoop」と同様、継続条件を満たさない為、すぐさま「Completed」が処理される
次に、Conditionを「true」にした場合です。


通常の「WhileLoop」であれば無限ループが発生するが、「LimitedLoop」の場合は指定回数処理された後に「Limited」が処理される
これにて有限ループノードの完成です!
■補足
無限ループ対策の別の方法として
「ForLoopWithBreak」を使用しても良いかと思います。
が、今回はあくまでカスタマイズの一例として紹介させていただきました。

回数制限は「ForLoop」の機能を、処理の中断に関しては「Break」の機能を 使用することで、本質的には「LimitedLoop」と 同じような使い方が出来そうです
■さいごに
いかがでしたか?
マクロ関数を自分好みに変更したいといった
場面が出てきた際には、是非カスタマイズをご検討ください。