【GDevelop 基礎 04】 一定間隔で反転する

今回作成するもの

一定間隔で反転して動きます。ここでは以下の 2 つを組み合わせます。

  1. 一定間隔で反転する
  2. 現在の反転状態に応じた方向に移動する

Interval_Flip Extension を作成

以下のように Interval_Flip, Forever_MoveH_WithFlipped の2つの Behavior を追加します。それぞれ、doStepPreEvents を追加します。

Interval_FliponCreated も追加します。

ここからは順に作っていきます。

Forever_MoveH_WithFlipped

【GDevelop 基礎 01】 横に移動するだけ - Make Everything Games でも X 軸正方向に移動するスクリプトを作りました。

今回は最初に述べた通りで、「現在の反転状態に応じた方向」つまり、反転した場合には X 軸の負方向に移動できるスクリプトを作ります。

パラメータの追加

speed だけです。ここは以前作成した Forever_MoveH と同じです。

doStepPreEvents の実装

【GDevelop 基礎 01】 横に移動するだけ - Make Everything Games では X Position を加算していくだけのスクリプトにしましたが、Objecthorizontally flipped に応じて正負の方向を反転させています。

Interval_Flip

パラメータの追加

「一定間隔」を実現するために、「毎フレーム増加する count」、「count の最大値 maxCount」を導入しています。 こうすることで、 maxCount 分のフレーム事に何かを起こすことができます。 (count は都度 0 に戻す)

そして、その「何かを起こす」が flipFlag となります。この bool 値を maxCountcount が溜まる度に True/False を切り替えることで、反転状態を切り替えることができます。

onCreated の実装

単純に count0 にしているだけです。パラメータの部分で初期値も 0 にしていますが、一応です。

doStepPreEvents の実装

一つずつ見ていきます。

ここは「条件なし」ですので毎フレーム実行されます。前述の通り「毎フレーム増加する count 」の実装になります。

最初の条件です。 「maxCountcount が溜まった」状態で以下を実行します。

  • count0 にします。
  • flipFlag の bool 値を反転させます。

これでパラメータの変更は終わりました。

この2つの条件節は、そもそも上位の 「maxCountcount が溜まった」状態でなければここには来ません。

先ほど flipFlag の bool 値を反転させたので、その値に応じて実際に Flip horizontallyObject (ここではキャラクターの Sprite)を見た目でも反転させます。

Flip horizontally Objectyes/no に直接 flipFlag を入れられればいいのですが、そうはできないのでこのように条件分岐させています。

ここまでを Unity のコードとして表現すると以下のようになるでしょうか。

void FixedUpdate() {
  count = count + 1;
  if (count == maxCount) {
    count = 0;
    flipFlag = !flipFlag;

    if (flipFlag) {
      GetComponent<SpriteRenderer>().flipY = true;
    } else if (!flipFlag) { // 実際には else だけでいいですが。
      GetComponent<SpriteRenderer>().flipY = false;
    }
  }
}

スプライトの Behavior に設定する

今回作成した Behavior を設定しているだけです。Max Count だけは 120 (約 2 秒) に変更しています。

Appendix: 他の方法

Add a force (angle) を使って移動を実装する

Add Enemies to the Game - GDevelop documentation

上記の公式のチュートリアルで、まさに今回のように反転しながら移動するエネミーが実装されています。

ここでは、エネミーの移動を Add a force (angle) を使っています。

同様に実装するとするならば、 Forever_MoveH_WithFlippeddoStepPreEvent を以下のようにすることになります。

チュートリアルの方では direction というエネミー自体のプロパティを利用して方向を判定しています。

現状、この記事では Behavior で完結できるようなスクリプトしか書いていないのでそうはしていません。

Object の角度を使って移動させる

Add a force (angle) を使った移動であれば、そもそも Object (つまり Sprite) の現在の角度を使って移動させることもできます。

ただし、Flip horizontally はあくまで画像の反転であり、角度は変わっていません。そうなると、角度を 180 度(つまり反対方向) に向ける必要があります。
しかし、そうするとイメージしてもらうと分かりますが、画像は縦方向にひっくり返ります。
つまり、今度は縦方向に画像も反転する必要が出てきます。

これで見た目としては同じになります。

こちらがややこしくなる一方で、移動の方は以下のようにシンプルに変更できます。

Object.Angle() つまり、現在の角度に基づいて移動させることができるようになるので、反転状態を気にする必要はありません。(さらに言えば、反転でなくとも、どんな角度でも前に進ませることができるようになります)