UnityユーザーのためのUEブループリント入門
コードとビジュアル両方のスクリプトを比較してゲームエンジンを学びます

11. 繰り返し処理

繰り返し処理について見てみましょう。Unreal Engineブループリント特有の繰り返し処理も紹介します。
  • whileループ
  • Tick(Update)イベントノードとループ文の違い
  • breakとcontinue
  • do〜while文
  • for文
  • [UEのみ]DoN、DoOnce

11. 繰り返し処理

11.1 whileループ

whileループを記述します。
void Start(){
    int a = 0;
    while(a < 5)
    {
        Debug.Log("aは" + a + "です");
        ++a;
    }
}
以下はaがwhileのループ外で代入しており、常にtrueになり、無限ループになりUnityを強制終了するしかないので以下のような文は書かないようにしてください。
void Start(){
    int a = 0;
    bool b = a < 5;
    while(b)
    {
        Debug.Log("aは" + a + "です");
        ++a;
    }
}
以下のように書き直すと動きます。
void Start(){
    int a = 0;
    bool b = a < 5;
    while(b)
    {
        Debug.Log("aは" + a + "です");
        ++a;
        b = a < 5;
    }
}

11.2 Updateメソッドとループ文の違い

Updateメソッドは毎フレーム呼ばれるメソッドです。ループ文は1フレーム内で完結する命令になります。以下のスクリプトを一旦以下のスクリプトをCubeにアタッチして実行してみると、期待した動きになりません。
void Start(){
    int a = 0;
    while(tranosform.position.x < 5){
        Debug.Log("このCubeのx座標は" + transform.position.x + "です");
        transform.position += Vector3.right;
    }
}

11.3 breakとcontinue

continueを使うと、カッコ内の処理を中断し、whileの先頭に戻ることができます。breakを使うと、whileから抜け出す。breakを使うことで、無限ループを回避することができます。
void Start(){
    int a = 0;
    while(true){
        ++a;
        if(a < 10){
            continue;
        }
        Debug.Log(a);
        break;
    }
}

11.4 do〜while文

do〜while文は、whileのカッコ内にループを抜ける条件を書いて、doの範囲内で処理を行い、条件を満たしたらループを抜けます。
void Start(){
    int a = 0;
    do {
        ++a;
        Debug.Log(a);
    }while(a > 5)
}

11.5 for文

forループを記述します。
void Start(){
    for(int i = 0; i < 5; ++i)
    {
        Debug.Log(i);
    }
}
whileループで記述すると以下のようになります。
void Start(){
    int i = 0;
    while(i < 5){
        Debug.Log(i);
        ++i;
    }
}

11. 繰り返し処理

11.1 whileループ

whileループのスクリプトをUE BPで記述します。

11.2 Tickイベントノードとループ文の違い

Tickイベントノードは毎フレーム呼ばれるメソッドです。ループ文は1フレーム内で完結する命令になります。以下のブループリントをCubeに記述して実行してみると、期待した動きになりません。
Playを実行するとCubeは動きません。

11.3 breakとcontinue

While Loopの場合はcontinueを実行することはできますが、breakに相当するノードがないため、While Loopの条件がTrueで実装すると無限ループになります。そのため、While Loopの条件はFalse条件になるデータノードを追加するか、別のループノードで実装するのが望ましいです。
※以下はcontinueを実現したブループリントになります。breakに相当する命令を実行していないため無限ループになりますので、実行しないこと。

11.4 do〜while文

Unityのdo~whileに相当するノードはなく、While Loopノードを使って一回処理してからループするような関数を作成します。Sequenceノードの2番目にBranchノードを用意して、Branchノードの条件がwhileカッコ内の条件に相当し、もしFalseなら再度自分の関数を呼び出すようにします。

11.5 for文

UE BPにおけるfor文の、Unityとの違いは、Last Indexの値はカウントに含まれるという点です。もしカウントに含ませたくない場合は、Last Indexの値に-1をした値を入れておく等処理を追加しておきます。
While Loopノードを使う場合は以下のようになります。

ForLoopWithBreakノード

for文による繰り返し処理を行っている途中で処理を終了するノードです。

11.6 [UEのみ]DoN、DoOnce

DoNとDoOnceは主にTickイベントなどで使われることを想定しています。do~whileとは異なり、条件は別途Branchノードで定義したりします。
DoNノードを試すときはレベルブループリントで確認します。

DoNノード

N回分のループを「Completed」に処理が流れます。For文との違いは、Enterノードが呼ばれた時1回実行します。それから、BeginPlayイベントノードでは実行されません。
アクタでインプットを実行するには、Enable InputノードでPlayerControllerを指定してから、任意のキー入力イベントノードからDoNノードに実行ワイヤーで結びます。ここでは0キーを5回押すと1から5まで表示され、5が出た後は実行されません。1キーを押すとDoNノードにリセットが伝わり、0キーを5回押すと1から5まで表示されます。0キー1回入力でループが走るわけではありません。
なお、レベルブループリントで入力イベントノードを使う場合は、Enable Inputノードを使う必要はありません。
🔗 参考リンク
アクタに入力を設定する操作手順
凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ
UE4 指定した回数だけ実行するフロー制御ノード(Do N)

DoOnceノード

最初の1回だけ「Completed」に処理が流れます。
🔗 参考リンク
凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ
UE4 一度だけ実行する(DoOnce)