目次
※この記事で使用している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を指定した回数だけ出力するマクロを作成してみます。
かなり見づらいですが、通常のLoop文に新しく「ExecCounter」を追加し、
引数のExecCountとExecCounterの値でもLoopCheckを行うようにしました。
ExecCountが上限に達した場合の次のループでは、ExecCounterのみ初期化されるようになっています。
また、配列の要素をすべて回しきったかどうかをIsAllCompから取得できるようになっています。
これを以下のようなBPを組んで実行してみます。
しっかりと配列の要素を3つずつ出力し、すべての要素が終わったらIsAllCompがTrueになって、OwariのPrintStringに処理が走りました。
このようなマクロを使えば、1フレームで処理処理する要素が多い場合などに、指定した回数づつの処理に分散でき、ヒッチなどの対策になります。
ただ、マクロ自体の処理が複雑になると、それ自体が処理不可の原因になりかねないので、使用の際は注意しましょう。
※この記事のサンプルプロジェクトは以下URLにアップされています
サンプルプロジェクト