【Vket Cloud】動画つき！ゼロから始めるHeliScript超入門⑦ - HeliScriptで制御構文を使う(for、while)

# はじめに
Vket Cloudでは、「HeliScript」という独自のスクリプトを使用してコーディングを行うことで、ワールド内に高度なギミックを導入することが出来ます。

本記事では、HeliScriptで使用可能な制御構文のうち、繰り返しに使用するfor、whileについて紹介します。

# 動画

<iframe width="560" height="420" src="https://www.youtube.com/embed/_3YKEUdQyiY?si=0IIi3ZHCswvRKBAc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# for文

forは回数を指定して繰り返す繰り返し構文です。
```
    int a;
    a = 0;

    //繰り返しの指定 int型変数「i」の初期値0、iを1ずつ加算しiが3未満の間繰り返しを行う
    for(int i=0; i<3; i++){
        a += i; // aにiを加算
        hsSystemWriteLine("aの中身は%dです" % a); //変数aの中身を表示
    }
```
上記のように、for文は、`for((繰り返し制御に使用する変数),(変数に対する条件),(変数に対して行う変化)){(繰り返しで行う処理)}`といった記載方法を行います。

:::note
文中で使用している`+=`は加算代入と言い、左側の変数に右側の数を足す、という意味です。
右側は変数でも特定の数でも構いません。

繰り返しで行う処理にて使用している`++`は前置増分と言い、変数に1を加える、という意味です。
:::

上記の例で実際に発生する処理は下記のようになります。
初回はiの中身が0であるため、aは0+0で0のままです。
したがって、「aの中身は0です」と出力されます。
iの中身を1にします。1は3より小さいので繰り返し処理が実行されます。
2回目はiの中身が1であるため、aは0+1で1になります。
したがって、「aの中身は1です」と出力されます。
iの中身を2にします。2は3より小さいので繰り返し処理が実行されます。
3回目はiの中身は2であるため、aは1+2で3になります。
したがって、「aの中身は3です」と出力されます。
iの中身を3にします。3は3より小さくないので、繰り返し処理は実行されず、終了します。
ゆえに、出力されるのは、
```
aの中身は0です
aの中身は1です
aの中身は3です
```
となります。

# While文

whileは条件を満たしている間ずっと繰り返しを行う構文です。
```
    int a = 0;
    while(a < 10){ // aが10未満の間ループする
        hsSystemWriteLine("aの中身は%dです" % a);
        a += 2;
    }
```

上記のように、while文は、`while(条件式){(繰り返しで行う処理)}`といった記載方法を行います。

上記の例で実際に発生する処理は下記のようになります。
初回はaの中身は0であるため、「aの中身は0です」と出力されます。
その後、2加算されaの中身は2となりますが、10より小さいので繰り返しが発生します。
2回目はaの中身は2であるため、「aの中身は2です」と出力されます。
その後、2加算されaの中身は4となりますが、10より小さいので繰り返しが発生します。
3回目はaの中身は4であるため、「aの中身は4です」と出力されます。
その後、2加算されaの中身は6となりますが、10より小さいので繰り返しが発生します。
4回目はaの中身は6であるため、「aの中身は6です」と出力されます。
その後、2加算されaの中身は8となりますが、10より小さいので繰り返しが発生します。
5回目はaの中身は8であるため、「aの中身は8です」と出力されます。
その後、2加算されaの中身は10となり、10より小さくないので繰り返しが発生せず、終了します。
ゆえに、出力されるのは、
```
aの中身は0です
aの中身は2です
aの中身は4です
aの中身は6です
aの中身は8です
```
となります。

:::note warn
条件式に使用している変数を繰り返し処理の中で更新しないと、処理が終わらない**無限ループ**が発生します。
:::

# 繰り返し処理から抜け出す・処理をせず続行

条件の達成状況に関わらず繰り返し処理の途中で処理を辞めたいときや、
処理をしたくないが繰り返しは続けたいときは、`break`、`continue`を使用します。

### break

breakは繰り返し処理を実行タイミングで終了します。

```
    int a = 0; // 変数aを定義、初期値0
    for(int i=0; i<10;i++){ // 10回繰り返し
        if(i%2 == 0){ // iを2で割ったあまりが0のとき
            a++; // aに1を加算する
            hsSystemWriteLine("%dは2で割り切れます" % i); // メッセージ出力
        }
        if(a>=3){ // aが3以上のとき
            break; // ループ終了
        }
    }
```

上記の例の場合、0を2で割った時のあまりは0なので、「0は2で割り切れます」が出力され、
aの中身が1加算され1になります。
1を2で割った時のあまりは1なのでそのまま次の繰り返しへ行き、
2を2で割った時のあまりは0なので「2は2で割り切れます」が出力、
aの中身が1加算され2になります。
3のときは何もなく次の繰り返しへ行き、4のときは「4は2で割り切れます」が出力されます。
また、aの中身が1加算され3になり。aが3以上の条件を満たすため、ここで繰り返し処理が終了となります。

ゆえに、10回繰り返しするfor文が5回目でbreakが実行され、繰り返し処理を終えてしまいます。

### continue

continueはその回の繰り返し処理をそこで終え、次の繰り返しへ進みます。

```
    int a;
    a = 0;
    for(int i<0; i<10; i++){
        if(i % 3 == 0){ // iが3の倍数のとき
            continue; // 処理を飛ばし、繰り返す
        }
        hsSystemWriteLine("iは%dです" % i);
    }
```

上記の例の場合、iが3の倍数だったとき、処理がスキップされ次の繰り返し処理が始まります。
iが0のとき、3で割ると0なので処理を飛ばします。
iが1のとき、3で割ると1なので「iは1です」が出力されます。
iが2のとき、3で割ると2なので「iは2です」が出力されます。
iが3のとき、3で割ると0なので処理を飛ばします。
この繰り返し処理をiが10より小さい数まで行われます。

ゆえに、最終的に出力されるのは、

```
iは1です
iは2です
iは4です
iは5です
iは7です
iは8です
```
となります。

次 : [⑧ HeliScriptでシーン上のアイテムを取得する](<https://qiita.com/shirapy/private/9a6fb9dbb64a33d37fb5>)
前 : [⑥ HeliScriptで制御構文を使う(if、switch)](<https://qiita.com/shirapy/items/064d7a26599deeb8296f>)