【UE4】ForEachLoopを段階的に出力するマクロ 【★★】

※この記事で使用しているUnrealのVersionは04.21.1です。

※この記事のサンプルプロジェクトは以下URLにアップされています
サンプルプロジェクト

「For Each Loop」は配列の要素をIndex0から順番に取り出して処理するマクロです。

このFor Each Loopの中身はこんな感じ。(StandardMacrosより)

見づらかったので、少し手を加えて説明します。

重要なのは「Local Integer」と「Sequence」ノードです。
「Sequence」ノードのThen0でマクロの外にあるLoopBodyにつながった処理をして、その処理が終わったらすかさず「Sequence」ノードのThen1の処理に行きます。

この際マクロの外に処理は出てしまっていますが、LocalIntegerの値はそのマクロが書いてあるアクターなどがメモリーからから消えるまで保存され続けます。

なので、LoopCountの値はIncrement(1値を増やす)されていき、配列の最後の要素までを順番に処理することが出来ます。

今回は、この「Sequence」と「Local変数」の特徴を使ってLoop処理に改造を加えていきます。

ForEachLoopWithDelay レベル【★★】

ひとまず今回はActorBPのマクロに処理を書きます。
なので、まずはBPアクターを作成します。

中を開き、新規でマクロを作成します。

作成したら、処理を書いていきます。

For文のLoopBodyに「Delay」ノードを使用すると、For文が終わったあとのフレームでDelayが処理され、結果的に配列の最後の要素の一度だけしか処理がされません。
詳しくは[UE4] フレームをまたいで配列を反復するマクロの作り方

↓レベルに作成したBPアクターをおいて、実行した際のPrint画面

↑最後の「i」だけPrintされる
※「K」BPアクター内のKeyイベントをバインド(キーボード入力を有効に)するには、
「ツールバー」内の「クラスのデフォルト」を押し、「詳細」ウィンドウにある「Input」→「Auto Receive Input」を「Player0」にしてみてください。

ループ処理の間にDelayを入れたい場合は、マクロを新規作成し(今回はアクター内にマクロを作成します)ForEachLoopマクロの中身を丸コピーし、画像の位置にDelayを入れるだけです。

作成したマクロを先程の処理と置き換えてみます。

しっかりとDelayを挟んですべての要素が実行されました。

ForEachLoopCountSave レベル【★★】

今度は、For文のLoopBodyを指定した回数だけ出力するマクロを作成してみます。

コメントなしVer

かなり見づらいですが、通常のLoop文に新しく「ExecCounter」を追加し、
引数のExecCountとExecCounterの値でもLoopCheckを行うようにしました。

ExecCountが上限に達した場合の次のループでは、ExecCounterのみ初期化されるようになっています。

また、配列の要素をすべて回しきったかどうかをIsAllCompから取得できるようになっています。

これを以下のようなBPを組んで実行してみます。

しっかりと配列の要素を3つずつ出力し、すべての要素が終わったらIsAllCompがTrueになって、OwariのPrintStringに処理が走りました。

このようなマクロを使えば、1フレームで処理処理する要素が多い場合などに、指定した回数づつの処理に分散でき、ヒッチなどの対策になります。
ただ、マクロ自体の処理が複雑になると、それ自体が処理不可の原因になりかねないので、使用の際は注意しましょう。

※この記事のサンプルプロジェクトは以下URLにアップされています
サンプルプロジェクト