ブループリントの基本的な構成要素⑭ カスタムのループ

ビデオの内容紹介 
オリジナルのループを作る方法について説明しています。例として作るループは、遅延をともなう While ループです。While ループのマクロを基にして作ります。

原題 Blueprint Essentials – 14 – Custom Loops

ご注意 チュートリアルでも先生が注意喚起しているように、以下ではエンジン内のアセットに手を加えます。チュートリアルと同じやり方であれば心配はいりませんが、誤った操作をするとそれらを破損させるリスクがともないます。以下を実践する場合は、ご自身の責任でお願いします。

while ループの正体 (1:10)

これから作る「遅延付き while ループ (While Loop with Delay)」とは、ループとループの間で指定した秒数分だけ待機させるものです。遅延は Delay 関数を使って簡単に実現できます。たとえば、

63 test
のようにすると、J キーを押すと、2 秒経ってから Hello を表示させ、さらに 2 秒後に Bye を表示させることができます。

ここで、次のようなグラフがあるとします。

62 test
これは、ごく単純なグラフで、3 回 Hello を表示するものです。(ForLoop を使えばもっと簡単になりますが、While ループが題材になっているため、このようなものにしました。)

これに遅延ノードを入れれば、わざわざカスタムのループを作らなくてもよいのではないでしょうか?

61 test
しかし、残念ながらこれは動作しません。Loop Body に Delay 関数を置けないからです。(注)

そこで、まず While ループの実体 (マクロ) を勉強します。(While ループのマクロを叩き台にしてカスタムのループを作るからです。) While ループのマクロは次のようになっています (While ループをダブルクリックすると、そのマクロが開かれます)。

10while macro
「ブランチ」はチュートリアルで (このブログでも) 既出です。Condition (条件) を満たす場合は、True のピン以降を実行し、満たされない場合は False を実行します。

「シーケンス」は左側の実行ピンによって発動すると、Then 0 、Then 1… につながっているものを順番に実行します。

だから、このグラフは、次のような意味があります。即ち、「入力値」というノードによって「ブランチ」が発動して、Condition が満たされると True に入り、「シーケンス」に入ります (見づらいのですが、「ブランチ」の True からは「シーケンス」がつながっています)。まず Then 0 が実行されるので、 Loop Body に入ります (この Loop Body は、While ループでも Loop Body と表示されます)。次に Then 1 が実行され「ブランチ」が再度発動します (ループしています)。Condition が満たされないと Completed (ループ終了) に入ります (この Completed は、While ループでも Completed と表示されます)。

これを基にして、While Loop with Delay を作っていきます。具体的には、While Loop with Delay のためのマクロを作成します。

スロー 
まず、StandardMacros を開きます。そのためには、
While ループをダブルクリックするか、
エディタのコンテンツ ブラウザで「表示オプション」 → 「エンジンのコンテンツを表示」にチェックを入れる → Engine フォルダを選択 → フィルタ欄にstandardmacros → StandardMacros を選択

[While Loop with Delay のマクロの完成図]
42 delay macro

StandardMacros が開いたら、
「+ マクロ」のアイコンをクリック → WhileLoopWithDelay という名前を付ける

「詳細」の「グラフ」/「カテゴリ」に Utilities Flow Control とタイプするか、先ほどの While ループのマクロの同じ欄に入っているものをコピーする

「詳細」の「グラフ」/「説明」に分かりやすい文を入れておく。(チュートリアルでは、While loop that has a set delay between loop executions. (ループの実行間で指定された遅れをともなった While ループ) という説明文を入れています。)

さらに、「詳細」タブで「入力値」「出力値」の「新規」ボタンを使って、完成画像のようにピンを追加する。

ワイヤを完成画像のようにつなげてから、保存する。

意味 
このグラフの動作は、ほぼ While ループと同じですが、異なる点は、Then 1 からのワイヤが直接「ブランチ」の実行ピンにつながるのではなく、Delay 関数を経由している点です。

Delay 関数の Duration (期間) は待機する時間のことですが、これは、「入力値」ノードの Delay ピン (While Loop with Delay の入力ピンまたは入力欄に相当するもの) から値が供給されます。

以上のようにしてから、アクタ ブループリント (下準備については、前回の『ブループリントの基本的な構成要素⑫ ForEachLoop』の「★テスト用ブループリントの作成方法」を参照) で、While Loop with Delay を使って次のようなグラフを組みます。

50 complete
While Loop with Delay は、右クリックメニューに表示されます (Utilities Flow Control によって)。Delay には「2」と入れます。これによって、V キーを押すと、2 秒の間隔をもって Hello と表示されるようになります。

これは実行結果が若干分かりづらいので、次のようなグラフを作ってみました。

80 complete
これを実行すると、「1 (2 秒間あき) 2 (2 秒間あき) 3 (2 秒間あき) Daaaa!!!」と表示されます。

これにて『ブループリントの基本的な構成要素』シリーズは完了です。たいへんお疲れさまでした!次回からは、『ブループリントのクイックショット』シリーズに入ります!




(注)
Loop Body に Delay 関数を置けない理由を、実験を通じて考えてみます。

まず、「シーケンス」の性質について実験します。

実験 
80 sequence

このグラフは、Zero、One、Two、Three を表示するものですが、Then 0、1、2、3 それぞれに Delay がはさまっているため、Zero を表示する前に 3 秒の待機があります。同様に、One の表示前には 2 秒の待機、以下同様です。

これを実行すると、Three、Two、One、Zero と表示されます。「シーケンス」の Then 0、1、2、3 は順番に実行されていくのですが、Delay が入ると、(たとえば) Then 1 は、 Then 0 につながっている Delay の終了を待ってから実行されるわけではないということが分かります。順番が来たら、さっさと実行するのです。

さて、ここで While ループについて考えてみます。While ループの実体である「ブランチ」と「シーケンス」を使ってグラフを組んでみます。

実験 
71 test
ここで、シーケンスの Then 0 は、While ループの Loop Body に当たります。この Then 0 に Delay 関数がつながっています。先の実験から分かったように、Then 1 は、Then 0 の Delay が終了するのを待ちません。

Then 1 がさっさとブランチを再度発動してしまいます。そのせいで Then 0 でまた 2 秒待機が入り (以下繰り返し)、というようになり、ハングアップ的状態に陥ります。

While の Loop Body は、この Then 0 に該当するのですから、While の Loop Body に Delay 関数をつなげるとエラーになるのです。

反対に次のように Then 1 に Delay をつなげるても Then 0 が「ブランチ」を先に再発動させるわけではないので、問題ありません。

81 delay

このことを利用して今回は While Loop with Delay を作ったということになります。



About なつのや

アンリアル・エンジン 4 を基礎から勉強するためのサイト「UE4 の学び部屋」を開いています。どうぞよろしくお願いいたします。
ブループリント

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>