今回作成するもの
Time scale | Layer time scale |
---|---|
【GDevelop 基礎 10】ずっと水平に移動して衝突したら反転する (衝突検知時の処理) - Make Everything Games 前回「衝突時に何かをする」方法を試しました。
今回は、ありがちなゲームオーバー的な表現としてゲームを停止することを試します。
レイヤー
今回はレイヤーを利用します。冒頭の Gif でいうと、キャラクター以外の「太陽」「雲」の2つが、キャラクターとは異なるレイヤーに属しています。
今回は以下のように Background
というレイヤーを作成しています。
レイヤーの作成については、Add a layer
という分かりやすいボタンがあるのでそこをクリックするだけです。
シーンの作成
今回はざっくり以下のようになっています。
Enemies
Scene Groups には、Enemy
,Enemy2
が入っていますCloud
,Sun
はBackground
レイヤーに属しています- レイヤーは以下の画像のようにプロパティパネルから変更できます
各オブジェクトの設定
Player
OnKeyPress_Move_Fixed
を使って、自由に移動できるようにしておきます。(動かさなくてもいいので、なくてもいいです)
【GDevelop 基礎 06】キーを押すと移動する ~斜め移動の速度の修正~ - Make Everything Games で作成しています。
Enemy, Enemy2
Forever_Chase
を使って Player
を追いかけ衝突するようにさせます。
【GDevelop 基礎 08】ずっと追いかける (他のオブジェクトとの関連を作る) - Make Everything Games で作成しています。
Cloud / Sun
とりあえず動き続けてくれれば何でもいいです。今回は以下の記事で作成したスクリプトを作成しています。
【GDevelop 基礎 04】 一定間隔で反転する - Make Everything Games
Cloud
に関しては X, Y 座標を変更する移動方法を用い、Sun
は Add a force
を使う移動方法を利用しています。(記事の Appendix に記載しています)
座標を直接変更する移動と、
Add a force
を使うケースで変化が出たのであえて二種類用意しています。
イベントシートの設定
Player is in collision with Enemies
が 2 行ありますが、これらはいずれかを Disable して実行してください。
冒頭の Gif 画像もこれらをそれぞれ Disable して実行しています。
Set the time scale of the scene to 0
のみを有効にしたのが Gif 画像の左側 (Time scale) です。Set the time scale of layer Base layer to 0
のみを有効にしたが Gif 画像の右側 (Layer time scale) です。
Repeat
イベントシートの先頭で Repeat for each instance of Enemies
となっていますが、これは For each objects
を利用しています。
以下のコンテクストメニューから追加できます。
今回は Enemies
グループに入っているインスタンス(つまり、 Enemy
, Enemy2
) を順に取り出し Action 側の Chase Target Enemies and Player
に渡しています。各インスタンスの名前も Action 側でそのまま Enemies
と扱うのは、コードに慣れていると「あれ?」となりますが、余計な変数が増えなくていいので慣れれば良さそうに思います。
動作確認
結果としては冒頭の Gif 画像の通りです。Layer time scale
に関しては想定通り、Base Layer
は停止し、Background
は動き続けているのですが、Time scale
の方は止まり方に違和感があります。
Time scale と Layer time scale
私はてっきり、Time scale
はゲーム(ループ) 全体を停止させ、Layer time scale
は特定のレイヤーのみを停止させると思っていました。
ただ、冒頭の Gif 画像を見てもらって分かる通りですが、Time scale
を利用しても Cloud
の全体の動きと、Sun
の縦方向の反転の動きは停止していません。
一方で、Sun
の Add a force
での左右への移動は停止しています。
- Physics Engine - GDevelop documentation
Timescale. It defines the scale of time the simulation will use. With a timescale of 0.5, the simulation will run at half the speed; with a timescale of 2, the simulation will be twice as fast. If timescale is 0, the simulation will pause. Super useful for bullet time effects!
- レイヤーとカメラ - GDevelop documentation
レイヤーの「タイムスケール」を使用すると、レイヤー内のすべてのアニメーションとすべてのオブジェクトの動きの速度を変更できます。レイヤーの時間を遅くするには、1 未満のタイムスケールを設定します。レイヤーの時間を速くするには、1 より大きいタイムスケールを設定します。デフォルトのタイムスケールは、すべてのレイヤーで 1 です。
あまり調査できていないのですが、上記のドキュメントを読む限りでは、Physics
では simulation (の speed) を、Layer
の方でもオブジェクトの速度を変更するとなっているので、今回の Cloud
のように座標を直接変更しているだけだったり、スプライトを反転させるだけというのは停止させられないのだと想像しています。
ではどうするか?
ここは単純な話でゲームが動いているかのフラグを用意し、停止が必要なイベントはそのサブイベントにまとめるということになりそうです。
Unity にも Time.timeScale
がありますが、こちらも誤解しているのではないかと思い始めたのでまた確認してみようと思います。