UE5から始める C++ & BP 14 【Blueprint版】Flow Control(Loop)
プログラムには3つの制御構造があります。
順次処理
繰り返し処理
分岐処理
実際はもっと複雑ですが、この3つができればプログラムができると言われています。
3つのうちの最後の1つ「繰り返し処理(Loop)」です。
人間では絶対に出来ない繰り返し回数をコンピューターは処理することができます。
倍ではなく2乗単位で毎年高速化しています。
優秀な友達とは仲良くならないと損です。
繰り返しを覚えてコンピューターと仲良くなりましょう。
前回は「Array(配列)」方法について調査しました。
今回は「Flow Control(Loop)」方法について調査していきます。
【Blueprint】Flow Control(Loop)
今回できること
Flow Control(Loop)は繰り返し処理を行うことができます。
10000回の計算をランダムに計算できるのがコンピューターの強みです。
ブループリントには3種類のLoopノードが用意されています。
For Loop
For Each Loop
While Loop
[For Loop]と[For Earch Loop]にはBreak付きのノードが用意されています。
3つのLoopで同じ結果になる処理を紹介します。
For Loop
For Each Loop
While Loop
学習用の新規レベル「Chapter_2_FlowControl_Loop」を作成する
学習用の新規レベルを作成します。
[File]メニューから[New Level…]を選択します。
[Default]を選択します。
[File]メニューからCurrent Levelを保存します。
ショートカット「Ctrl + S」でも保存できます。
「Maps」フォルダを選択し、Nameに「Chapter_2_FlowControl_Loop」を入力し、[Save]ボタンをクリックします。
Blueprintを複製する
「BP_Array」を複製(Ctrl + W)して、「BP_FlowControl_Loop」を作成します。
For LoopノードでPrintStringを繰り返し呼び出す
For Loopノードを使用して[PrintString]ノードを繰り返し呼び出します。
メニューから[For Loop]を選択します。
[For Loop]ノードの[Last Index]ピンの値を[4]に設定します。
Custom Event[PrintHello]が呼ばれたら、[For Loop]ノードを呼び出します。
[For Loop]ノードの[Loop Body]と[printString]ノードを接続します。
[PrintString]ノードを追加し、図のように[For Loop]ノードの[Completed]と[PrintString]ノードを接続します。
[For Loop]ノードの[Index]の値を確認したいので、[PrintString]ノードの[In String]に接続します。
[Compile]ボタンをクリックします。
Level Editorに戻り、「BP_Array」をViewportにDrag&Dropします。
Level Editorの[Play]ボタンをクリックします。
[H]キーをPressすると[PrintString]ノードが繰り返し呼び出されました。
[For Loop]ノードの[First Index]で[0]、[Last Index]が[4]と設定されているので、0~4の5回繰り返されます。
[For Loop]ノードの[Index]の値は[LoopBody]が呼び出された後に値が[+1]されます。
[Last Index]の[4]が呼び出された後に、[For Loop]ノードの[Completed]が呼ばれます。
For Loopノードで配列をすべて出力する
[For Loop]ノードで配列をすべて出力するように編集します。
[For Loop]ノードの[Last Index]に配列のLastIndexを設定します。
配列のLastIndexの求め方は「配列のLength - 1」でした。
[For Loop]ノードの[Index]を使用して、配列[Messages]の[Get]ノードから値を取得します。
配列[Messages]の[Get]ノードを[PrintString]ノードの[In String]に接続します。
[For Loop]ノードを使用した配列をすべて出力する処理です。
[Compile]ボタンをクリックします。
Level Editorの[Play]ボタンをクリックします。
[H]キーをPressすると配列[Messages]の値を最初から最後まで出力します。
For Loop with BreakノードでLoopを途中で抜ける
[For Loop]ノードには、Input側に[Break]実行ピンを持つ[For Loop with Break]ノードが用意されています。
[Break]実行ピンの動きを確認しましょう。
メニューから[For Loop with Break]を選択します。
[For Loop]ノードの接続を、[For Loop with Break]を使用するように接続し直します。
[For Loop with Break]ノードの[Break]実行ピンを呼び出すために分岐を作成します。
文字列の中に[Bonjour]が含まれていた時に、[For Loop with Break]ノードの[Break]実行ピンを呼び出すように編集します。
[Get]ノードからDrag&Dropし、Stringカテゴリーの[Contains]を選択します。
[Contains]ノードは[Search In]に設定した文字列内で[Substring]の文字列が含まれているか確認するノードです。
[Substring]に[Bonjour]を設定します。
[Break]を呼び出す分岐を作るので、[Contains]ノードの[ReturnValue]から[Branch]ノードを追加します。
[Branch]ノードの接続を以下のように接続します。
[Branch]ノードの[Condision]が[True]の時に、[For Loop with Break]ノードの[Break]実行ピンを呼び出す。
[Branch]ノードの[Condision]が[False]の時に、[PrintString]ノードを呼び出す。
[Compile]ボタンをクリックします。
Level Editorの[Play]ボタンをクリックします。
[H]キーをPressすると配列[Messages]の値に[Bonjour]が含まれている時にBreakが呼ばれるので、配列[Messages]のIndex[2]までが[PrintString]ノードで出力されます。
[For Loop with Break]ノードは[Break]実行ピンが呼ばれるとループを終了し、[Complited]実行ピンが呼ばれます。
[Break]実行ピンが呼ばれなければ、[For Loop]ノードと同じ動きをします。
[For Loop with Break]ノードはループを抜ける条件がある時に使用します。
Foreach Loop with Breakノードで配列をすべて出力する
配列をループさせるのであれば、[For Loop]ノードより、[For Earch Loop]ノードを使用した方がスマートに処理を書くことができます。
[For Earch Loop]ノードにも[Break]実行ピンを持った[For Earch Loop with Break]ノードがあります。
[For Loop with Break]ノードを使用した処理を[For Earch Loop with Break]を使用した処理に変更します。
メニューから[For Each Loop with Break]を選択します。
[For Each Loop with Break]を使用した処理に接続し直します。
[Compile]ボタンをクリックします。
Level Editorの[Play]ボタンをクリックします。
[H]キーをPressすると配列[Messages]の値に[Bonjour]が含まれている時にBreakが呼ばれるので、配列[Messages]のIndex[2]までが[PrintString]ノードで出力されます。
配列を順番に繰り返しするのであれば、[For Loop]ノードより[For Each Loop]の方がスマートに処理を実装できます。
While loopノード
最後に[While Loop]について説明します。
[For Loop]や[For Each Loop]より使用頻度が少ないのでアッサリと説明します。
[While Loop]ノードはIndexNoがいくつか教えてくれないので、IndexNoを持つ変数を追加します。
メニューから[While Loop]を選択します。
[While Loop]ノードを使用した時の配列の値を出力する処理です。
[For Loop with Break]ノードや[For Each Loop with Break]ノードを使用した時と同じ動きになる図です。
[Compile]ボタンをクリックします。
Level Editorの[Play]ボタンをクリックします。
[H]キーをPressすると配列[Messages]の値に[Bonjour]が含まれている時に、[While Loop]ノードの[Condision]が[False]になるので、[While Loop]ノードの[Conpleted]が呼ばれます。
[While Loop]ノードは[Condition]の値が[True]の時に[Loop Body]を呼び出し、[Condition]の値が[False]の時に[Completed]を呼び出します。
すべて保存
Blueprint側の説明はここまでになります。
[Content Browser]から[Save All]ボタンをクリックし、[Save Selected]ボタンをクリックしてプロジェクトの変更のあったアセットをすべて保存します。
まとめ
JavaやC#からFor Each Loopを触りだしてから、配列のループ処理が簡単になりました。「For Each Loop」は革命でした。
そんな「For Each Loop」が最初から使える。
なんて幸せなことでしょうか。
ついに最後の山場を乗り越えることができました。
あともう少し!
参照URL
UE4から始めるC++&Blueprint 進捗とロードマップ
Zennで進捗報告を行い、GitHubでロードマップを公開中です。
よかったら覗いてみてください。
この記事が気に入ったらサポートをしてみませんか?