ビデオの内容紹介
ForEachLoop の使い方を 2 つの例を使って説明しています。配列といっしょに使われるループで平易で短い内容となっています。
原題 Blueprint Essentials – 12 – For Each Loop
☆ForEachLoop の使い方 (0:09)
まず、ForEachLoop の簡単な例が紹介されています。ビデオでは直接紹介されていませんが、グラフを作るまでの下準備を簡単に紹介します (あくまでも一例なので必ずしもこのようでなくても構いません)。
★テスト用ブループリントの作成方法
大雑把に言うと、コンポーネントのための新規ブループリントを作って、レベルに配置します。具体的には、
スロー
コンテンツ ブラウザでブループリント フォルダをクリック → 「新規」をクリック → 「Blueprint」をクリック → 「アクタ」をクリック → 新規ブループリントファイルに名前を付ける → そのファイルをダブルクリック → (ブループリント エディタが開かれる) → 右上でコンポーネント モードにして (「コンポーネント」をクリック) → コンテンツ ブラウザの (たとえば) Props フォルダから SM_Bush を「コンポーネント」タブにドラッグアンドドロップ → Blueprint フォルダに戻りこの新規ファイルをビューポートにドラッグアンドドロップ → 右上でデフォルト モードにして、Input の Auto Receive Input で Player 0 を選択 → (ブループリントエディタ右上でグラフモードにしてからグラフを作成する)
作成するグラフは、ある配列変数に入っている値をすべてスクリーンに表示するというものです。できあがりは次のようになります。(一部分かりやすくするために改変しています。)
実行結果は、次のようになります。
このグラフの意味をまとめておきます。大雑把な流れは、いつものように白三角の実行ピンをとだります。F キーが押されると、ForEachLoop が発動します。
ForEachLoop は、その Array (配列) ピンにつながっている配列のインデックス (番号) ごとに何らかの処理をします。
この例では、Musician という配列変数のインデックスが 0 から 3 まであり、それぞれ Bill、Miles、Wynton、Joe という値が入っています (画像内左下参照)。この 0 から 3 まで (全部で 4 回)、Loop Body につながっていることが処理されます。
ForEachLoop の Loop Body には Print String につながっているので、この配列変数のインデックスの数だけ (4 回) 繰り返し、何らかの文字列をスクリーンに出力することになります。
Print String の In String ピンは、文字列を入力 (in) するためのピンなので、それにつながっている Musician という配列変数の値が文字列としてスクリーンに表示されることになります。
次に作成するグラフは、V キーを押すと、ある種のアクタをすべて非表示にします。さらに V キーを押すと、今度は表示されるようにします。表示/非表示が交互に行われるグラフを作ります。このグラフを作成する前に次のような準備を行います。
スロー
コンテンツ ブラウザで Particles フォルダをクリック → P_Steam_Lit をビューポートにドラッグアンドドロップ → それらをいくつかコピーする (画像では全部で 3 つにしました)
グラフの出来上がりは、次のようになります。
このグラフの意味をまとめます。
V キーを押すと、f Get All Actors of Class が発動します。この関数は、ワールドに置かれている指定されたクラスのアクタの情報をすべて配列に入れて返します (=配列に入れてその結果を Out Actors ピンから供給してくれます)。
この関数の Actor Class には、下のドロップダウンから Emitter が選択されています。これから取得する P_Steam_Lit が ParticleEmitter クラスに属するからです。
関数の Out Actors ピンから供給されたアクタの入っている配列が、ForEachLoop の Array (配列) につながっているので、この配列の個数分だけ (画像では 3 個だから 3 回) ループ処理されることになります。
ForEachLoop は f Set Actor Hidden in Game (ゲーム内でアクタを非表示にする) を発動させます。
この関数の Target には、P_Steam_Lit が入った配列が ForEachLoop から供給されているので、3 つの P_Steam_Lit が順々に非表示にされていきます。
f Set Actor Hidden in Game の New Hidden ピンには Show という bool 型の変数がつながっています。New Hidden ピンは、「アクタを非表示にするか否か」を指定するピンです。ここに変数をつながなければ (元の形にすると) 次のようになります。
これだけでも P_Steam_Lit を非表示にすることができます (ただし表示/非表示の切り替えまではできません)。New Hidden ピンにチェックが入っていますが、ここにチェックを入れなければ非表示にはならないのです。
このチェックは True という意味です。言い換えれば、この関数でアクタを非表示にするには、この New Hidden が True でなければなりません。
ちなみにこの New Hidden が True になっているかどうかは、次のようにして変数に昇格して (Show という名前の bool 型変数)、その値を表示してみると確かめることができます。
3 つ True が繰り返されているのは、もちろんループが働いているからです。
話を戻します。New Hidden ピンにつながっている Show という bool 型の変数は、このチェック/非チェックの代わりになるものです。
この Show は、画面内左下隅を見ると、「デフォルト値」にチェックが入っています。つまり、最初は True から始まることになります。このままでは、True であるままですが、FlipFlop (フリップ フロップ) を使うとその値を切り替えることができます。FlipFlop は A と B の値を交互に取ります。
そこで、この FlipFlop の機能について実験して、その基本を理解します。次のようなグラフを組んでみました。
これはごく単純なもので、ゲームを Play すると ForLoop が発動して、まず Index (1) が Print String で表示され、続けて FlipFlop が A の場合に、 IsA (A です) の値が Print String で表示されます。IsA の値は、FlipFlop が A の場合 (「A です」の場合) は、True になります。
まず FlipFlop は A から始まります。だから、結果の画像でも「1 」の上が「True」となっています。ループが「2」に入ると、FlipFlop は B になるので (単純に交互に変わるので) FlipFlop の後の Print String にはつながらないので、結果の画像でも「2」の上には True も False も表示されていません。
反対に、B から Print String につないだグラフの結果を見ると、さらによく FlipFlop の動作が分かります。
最後に、ビデオのグラフと同じように A、B 両方からつないでみます。
予想通り、A の時 (ループの奇数回数の時) は、IsA の値が True となり、B の時 (ループが偶数回数の時) は、IsA の値が False となります。
以上のことを踏まえて、話を元にもどすと、ForEachLoop でループが完了するたびに (先のグラフとは異なり、Completed につながっています)、FlipFlop の A と B が交互に変化し、したがって IsA の値 (True/False) も変化します。したがって、そこにつながっている Show を Set するノードでは、Show に IsA の値を入れるようになっていますが、ループが完了するたびにShow には True と False が交互に入ることになります。
そして Show に True が入っている時には f Set Actor Hidden in Game がアクタを隠し、False が入っている時にはアクタを表示することになるのです。
なお、完成グラフを V キーを押して実行すると、アクタが非表示となります。これは Show が最初 True から始まるからです (Show のデフォルト値にはチェックが入っています)。この 1 回目の非表示 (ループ 3 回分) が完了すると、FlipFlop が働いて、Show は True にセットされます (True のままです)。これは、FlipFlop が A から始まるからです。だから、V を 2 回目として押すと、やはりアクタは非表示です。ただし、この直後 FlipFlop が働いて、Show は False にセットされます。だから 3 回目に V を押すと今度はアクタが表示されることになります。2 回目の動作が若干残念です。
今回はこれまでです。どうもおつかれさまでした!