今回作成するもの
一定間隔で反転して動きます。ここでは以下の 2 つを組み合わせます。
- 一定間隔で反転する
- 現在の反転状態に応じた方向に移動する
Interval_Flip
Extension を作成
以下のように Interval_Flip
, Forever_MoveH_WithFlipped
の2つの Behavior を追加します。それぞれ、doStepPreEvents を追加します。
Interval_Flip
は onCreated も追加します。
ここからは順に作っていきます。
Forever_MoveH_WithFlipped
【GDevelop 基礎 01】 横に移動するだけ - Make Everything Games でも X 軸正方向に移動するスクリプトを作りました。
今回は最初に述べた通りで、「現在の反転状態に応じた方向」つまり、反転した場合には X 軸の負方向に移動できるスクリプトを作ります。
パラメータの追加
speed
だけです。ここは以前作成した Forever_MoveH
と同じです。
doStepPreEvents の実装
【GDevelop 基礎 01】 横に移動するだけ - Make Everything Games では X Position
を加算していくだけのスクリプトにしましたが、Object
の horizontally flipped
に応じて正負の方向を反転させています。
Interval_Flip
パラメータの追加
「一定間隔」を実現するために、「毎フレーム増加する count
」、「count
の最大値 maxCount
」を導入しています。
こうすることで、 maxCount
分のフレーム事に何かを起こすことができます。 (count
は都度 0 に戻す)
そして、その「何かを起こす」が flipFlag
となります。この bool
値を maxCount
分 count
が溜まる度に True/False
を切り替えることで、反転状態を切り替えることができます。
onCreated の実装
単純に count
を 0
にしているだけです。パラメータの部分で初期値も 0
にしていますが、一応です。
doStepPreEvents の実装
一つずつ見ていきます。
ここは「条件なし」ですので毎フレーム実行されます。前述の通り「毎フレーム増加する count
」の実装になります。
最初の条件です。 「maxCount
分 count
が溜まった」状態で以下を実行します。
count
を0
にします。flipFlag
の bool 値を反転させます。
これでパラメータの変更は終わりました。
この2つの条件節は、そもそも上位の 「maxCount
分 count
が溜まった」状態でなければここには来ません。
先ほど flipFlag
の bool 値を反転させたので、その値に応じて実際に Flip horizontally
で Object
(ここではキャラクターの Sprite)を見た目でも反転させます。
Flip horizontally Object
のyes/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_WithFlipped
の doStepPreEvent
を以下のようにすることになります。
チュートリアルの方では direction
というエネミー自体のプロパティを利用して方向を判定しています。
現状、この記事では Behavior で完結できるようなスクリプトしか書いていないのでそうはしていません。
Object の角度を使って移動させる
Add a force (angle)
を使った移動であれば、そもそも Object (つまり Sprite) の現在の角度を使って移動させることもできます。
ただし、Flip horizontally
はあくまで画像の反転であり、角度は変わっていません。そうなると、角度を 180
度(つまり反対方向) に向ける必要があります。
しかし、そうするとイメージしてもらうと分かりますが、画像は縦方向にひっくり返ります。
つまり、今度は縦方向に画像も反転する必要が出てきます。
これで見た目としては同じになります。
こちらがややこしくなる一方で、移動の方は以下のようにシンプルに変更できます。
Object.Angle()
つまり、現在の角度に基づいて移動させることができるようになるので、反転状態を気にする必要はありません。(さらに言えば、反転でなくとも、どんな角度でも前に進ませることができるようになります)