【GDevelop 素振り】Identifier parameter の挙動確認

Identifier parameter

Identifier (text) 日本語環境では 識別子 (テキスト) と表記される Function の Parameters の型です。

以下の公式ドキュメントの「Identifier parameter」の節に説明があります。

Functions - create your own actions, conditions or expressions - GDevelop documentation

This parameter enables auto-completion for previously entered values from other events with the same identifier name and scope.

上記のような説明があるのですが、個人的にパッと理解できなかったので、実際に利用しつつ挙動を確認したいと思います。

確認の準備

Function を作成

以下で、それぞれの Parameters を示します。

TestIdentifierScopedObjectAndScene

TestIdentifierScopedObject

ここでポイントなのは、1つ目の引数 IdScopedObjectIdentifier name が、上記の TestIdentifierScopedObjectAndScene同じになっていることです。

2つ目の引数 IdScopedObject2Identifier name に同じものがありません。

3つ目の引数 IdScopedObject3Identifier name は同じですが、Scope が異なります。

シーンの設定

上記のように Sprite を2つ用意します。

挙動確認

ここからはイベントシートに記載します。

まずは、Character1 に対して、Object と Scene を scope とした引数をそれぞれ文字列で渡します。

異なるオブジェクトに対しての挙動

異なるオブジェクトに対して、同じ Function (TestIdentifierScopedObjectAndScene) を呼び出します。

上記のように IdScopedScene つまり Scope が Scene の引数のみ候補が表示されます。

逆に IdScopedObject つまり Scope が Object の引数は候補がでません。

同じオブジェクトに対しての挙動

続いて同じオブジェクトに対して、異なる Function (TestIdentifierScopedObject) を呼び出します。

上記のように IdScopedObject つまり Scope が Object の引数は補完されます。

これは、Identifier name"Id_Scoped_Object" で同じであるために補完されています。

一方で、2つ目、3つ目の引数は Identifier name、Scope が異なるため補完されません。

ここでは試していませんが、Scope が Scene で Identifier name も同じであれば、同じオブジェクトでも当然補完されます。

まとめ

Identifier paramter の挙動に関して簡単にですが確認しました。

【GDevelop 素振り】チェックポイント機能 - Make Everything Games の中で、Player の Object variable 名を指定するのに使われていたのがきっかけですが、指定ミスを避けるためにも使ってみると便利だなと思える機能でした。

【GDevelop 素振り】チェックポイント機能

プラットフォーマーチュートリアルのチェックポイント機能

プラットフォーマー チュートリアル Part 8:チェックポイントをゲームに追加しよう - GDevelop documentation

上記の公式のチュートリアルの最後でチェックポイント機能を作成しています。

チュートリアルでは Scene variables として CheckpointX, CheckpointY の変数を用意します。
シーンの開始時には、プレイヤーの初期座標をそこに入れます。
シーン中のチェックポイント用のオブジェクトと衝突した際には、その座標をそこに入れます。

そして、プレイヤーがやられた場合には、その CheckpointX, Y の座標に戻すというものです。

Extension の Checkpoints

Extension として Checkpoints が公開されています。

Checkpoints - GDevelop documentation

サンプルプロジェクトを開いてみると、以下のように関数のみで構成された Extension であることがわかります。

利用のされ方

引き続きサンプルプロジェクトで利用のされ方を確認してみます。

まず、シーンには PlayerCheckpoint のオブジェクトが複数あることを確認しておきます。

チェックポイントの保存

  • シーンの開始時には Player の座標を保存 (Save checkpoint) している
  • PlayerCheckpoint オブジェクトに衝突した際に、Checkpoint の座標を保存している

ここまでは、プラットフォーマーチュートリアルとほぼ変わりませんが、一つ異なることがあります。

保存先の CheckpointScene variables ではありません。(もちろん Global variables でもない)

Checkpoint of Player となっているので、Player の Object variables かとも思いましたが、そこにもありません。あるのは dead フラグだけです。

では、このままこの保存処理の実態である、SaveCheckpoint 関数を見ていきます。

SaveCheckpoint 関数

設定・パラメータ

改めてシーンが始まった際の使われ方を見てみると以下のようになっており、ToSaveObjectPlayerCoordinateX, CoordinateYPlayer.X()/Y() がそれぞれ入っていることが分かります。

最後のパラメータである CheckpointName ですが、これは次のイベントで利用される値のキーのようなものです。 "Checkpoint" という文字列が渡されていることだけ押さえておきましょう。

イベント

続いてイベントです。

まず、GetArgumentAsNumber("CoordinateX")` ですが、パラメータとして渡ってきた X 座標、Y 座標を数値として取り出しているようです。

GetArgumentAsNumber は現在は利用しないようです。直接パラメータ名を書くだけに変更されています。

[Solved] GetArgumentAsNumber() not proposed in expression editor (This is intended) - #2 by Keith_1357 - Bugs reports - GDevelop Forum

続いて、__Checkpoints.Position["X" + GetArgumentAsString("CheckpointName")]です。
まず、GetArgumentAsString("CheckpointName") を渡された "Checkpoint" 文字列に置き換え、"X" と結合すると __Checkpoints.Position["XCheckpoint"] となることがわかります。

ここに CoordinateX の値を代入しているようです。

そして、この __Checkpoints.Position["XCheckpoint"]ToSaveObject つまり今回の使われ方では Player の変数であることが分かります。

では、実際にデバッガーを使って Player のオブジェクト変数を見てみます。

型情報付きの JSON 形式に構造化されていますが、__Checkpoints.Position["XCheckpoint"] (この場合は __Checkpoints.Position.XCheckpoint と考えた方が見やすいかも) であることが分かります。

ただ、前述で確認した通り、Player のオブジェクト変数の定義にはこの __Checkpoints.Position は存在しないため、この変数のデータはゲーム中に追加されるものである事がわかります。

ちなみに、ゲーム開始時以外に、Checkpoint のオブジェクトと衝突した時にも以下のようになるだけで、保存される座標が衝突した Checkpoint のものになるだけです。

LoadCheckpoint 関数

続いて、読み出しの部分も見ていきます。

設定・パラメータ

もう一つ SetIgnoreUndefined というパラメータがあるのですが、上記の通り「イベントシートの文章」にも記載されておらず、FALSE で固定のようなので無視しました。

この関数は PlayerTriggerDeath 関数で以下のように呼び出されています。

ToLoadObject, ToMoveObject の両方に Player が渡されており、SaveCheckpoint の方にも出てきた CheckpointName"Checkpoint" という同じ値で渡されているのが分かります。

イベント

まず条件部分についてですが、要は先程の JSON で見た XCheckpointYCheckpoint の値について確認しています。

前述の通り SetIgnoreUndefined は必ず FALSE なので、どちらかが欠けていても条件を満たします。

そしてアクション部分ですが、ToMoveObject つまり今回の例では Player の座標を ToLoadObject つまりこちらも Player ですが、Player__Checkpoints.Position 変数に保存されている座標に置き換えているということです。

まとめ

「プラットフォーマーチュートリアル」の方は、Scene variables にチェックポイントの座標を保存し、イベントシートを通して、プレイヤーの初期位置や、それぞれのチェックポイントオブジェクトの座標を衝突時に保存し、プレイヤーが失敗した時にはその座標に戻すということをしていました。

「Checkpoints Extension」の方は、保存先が特定のオブジェクト(例では Player) のオブジェクト変数 (Object variables) でした。
それ以外の点については、サンプルでの使われ方としてはですが、プラットフォーマーチュートリアルとそれ程違いはありませんでした。

Scene variables ではなく Object variables に保存する利点はありそうですが、今回確認した「単独のプレイヤーのチェックポイント機能」という点ではどちらでも問題はなさそうです。

【GDevelop 基礎 11】衝突したらゲームを停止する (Time scale)

今回作成するもの

Time scale Layer time scale

【GDevelop 基礎 10】ずっと水平に移動して衝突したら反転する (衝突検知時の処理) - Make Everything Games 前回「衝突時に何かをする」方法を試しました。

今回は、ありがちなゲームオーバー的な表現としてゲームを停止することを試します。

レイヤー

今回はレイヤーを利用します。冒頭の Gif でいうと、キャラクター以外の「太陽」「雲」の2つが、キャラクターとは異なるレイヤーに属しています。
今回は以下のように Background というレイヤーを作成しています。

レイヤーの作成については、Add a layer という分かりやすいボタンがあるのでそこをクリックするだけです。

シーンの作成

今回はざっくり以下のようになっています。

  • Enemies Scene Groups には、Enemy, Enemy2 が入っています
  • Cloud, SunBackground レイヤーに属しています
    • レイヤーは以下の画像のようにプロパティパネルから変更できます

各オブジェクトの設定

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 座標を変更する移動方法を用い、SunAdd 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 の縦方向の反転の動きは停止していません。

一方で、SunAdd 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 がありますが、こちらも誤解しているのではないかと思い始めたのでまた確認してみようと思います。

【GDevelop 基礎 10】ずっと水平に移動して衝突したら反転する (衝突検知時の処理)

今回作成するもの

【GDevelop 基礎 07】Physics Engine で衝突する - Make Everything Games で一度衝突した場合の処理について触れました。

前回は、「衝突すると止まる(進めない)」ことの確認程度でしたが、今回は簡単に「衝突を検知し、何かする」の例としてここまでやってきた「反転する」をしてみます。

Handling collisions in your game

Handling collisions in your game - GDevelop documentation

上記の公式チュートリアルでは以下の3つが紹介されています。

  • Separate objects を使うパターン
  • Platformer games を使うパターン
  • Physics を使うパターン

ここでは、Separate objectsPhysics を使うパターンをやってみます。

冒頭の Gif 画像は上が Separate objects を使ったパターン、下が Physics を使ったパターンになっています。

Separate objects を使うパターン

Forever_MoveH_OnCollision_Flip の作成

どの Extensions に保存しても問題ありません。ToggleFlipAction で作成しています。

プロパティの追加

移動速度の Speed と現在の反転状態を持つ IsFlipped を作成します。Flippable behavior に Horizontally flipped の条件式があるので、そのまま使えそうなのですが、If-else の構文の使い方が私がまだ分かっておらず、仕方なくフラグを経由しています。

以下のようにしたいのですが、以下の場合は1つ目を通過すると2つ目も必ず通過してしまうので、反転状態を切り替えられないのです。

ToggleFlip の実装

この Function は衝突検知時に呼び出されることを想定しています。衝突県知事に反転状態を切り替えます。

Parameters

今回は追加はありません。

Configuration

Sentence in Events Sheet を記載しています。 (_PARAM0_ は Behavior を付けた Object です)

Events

IsFlipped プロパティを反転させ、その値に応じて Flip horizontally を切り替えています。

doStepPreEvents の実装

Events

今回は水平方向のみの移動なので、Add a force で X 軸方向のみに Speed プロパティを設定しています。

ToggleFlip Function で反転は行われているので、その状態に応じて Speed の方向を切り替えているだけです。

【GDevelop 基礎 04】 一定間隔で反転する - Make Everything Games ここの実装ともまた少し異なっていますが、お好みの方法で良いと思います。

シーンの準備

今回は以下のように2つの Wall をキャラクターを挟むように配置しています。

今回はこの Wall をまとめて扱うために Scene Groups に Walls を追加し、そこに2つの Wall をまとめます。

イベントシートの設定

ここでようやく CollisionSeparate objectsが出てきます。

Collision Separate objects

上記の通り、いずれも CharacterWalls の関係として定義しています。

これで、WallsCharacter が衝突して通過しないようになります。その後 ToggleFlip が呼び出され反転されて移動するようになります。

Trigger Once

今回、Trigger Once while true を利用しています。これは、1フレームではこの処理が一度しか実行されないようにするものです。

これを付けないと、この判定が複数回実行されてしまい、壁際でくるくると反転を繰り返してしまいます。

Physics を使うパターン

Forever_MoveH_OnCollision_Flip_Physics の作成

名前の付け方は違いますが、Forever_MoveH_OnCollision_Flip と基本は同じです。

プロパティの追加

Forever_MoveH_OnCollision_Flip に追加して Physics Engine 2.0 を Required Behavior として指定しています。これで、この Behavior を付けるオブジェクトは必ず Physics Engine 2.0 が付いている状態になります。

### ToggleFlip_Physics の実装

Forever_MoveH_OnCollision_Flip と同じです。

doStepPreEvents の実装

Events

Forever_MoveH_OnCollision_Flip と同じように見えるのですが、force を与えるアクションが Apply force という Physics Engine 用のものに変わっています。

【GDevelop 基礎 07】Physics Engine で衝突する - Make Everything Games この時作成したスクリプトだと Add a force でも動作したのですが、今回はうまくいかず Apply force を利用しています。

シーンの準備

先ほどとやることは同じです。Wall_Physics はグループ化します。

また、各 Wall_Physics にも Physics Engine 2.0 を付け、Static にしておきます。詳細は 【GDevelop 基礎 07】Physics Engine で衝突する - Make Everything Games を確認してください。

イベントシートの設定

まず、Condition 側の Collision 判定を確認します。

見て分かる通りで、先程の Collision とは異なっています。以下のように Physics 用は別に用意されているためです。

また、Action 側は Toggle Flip だけだということが分かります。

つまり、Physics Engine 2.0 を使っている場合は、そもそもオブジェクト同士が衝突するため、Separate objects のような処理が必要ないということです。

シーンのキャラクターの Behavior の設定

Forever_MoveH_OnCollision_Flip_PhysicsSpeed は実際には速度を表すものではないため(名前変えるべきでした)、ここでは値を 5 まで下げておきます。

また、Physics Engine 2.0 の設定も Fixed Rotation にチェックを入れておきます。これを入れないと、キャラクターがくるくる回りながら移動してしまいます。
加えて、Gravity Scale0 にします。今回は床を設置していないため無重力として動いて欲しいためです。

動作確認

だいぶざっくりした形になってしまいましたが、Separete objectsPhysics のそれぞれの機能を使った衝突時の処理の記述を試すことができました。

【GDevelop 基礎 9】方向転換 / ずっと逃げる

今回作成するもの

前回の 【GDevelop 基礎 08】ずっと追いかける (他のオブジェクトとの関連を作る) - Make Everything Games では、追ってくるキャラクターは方向が変わっても後ろ向きのままで移動しました。

よって、今回は追ってくる方向に応じて左右に Flip するように変更します。

それに加えて、追ってくるキャラクターとほぼ同じ作り方で「ずっと逃げる」キャラクターを作成します。

Forever_Chase Behavior の Chase Target Function 変更

まずは、追ってくるキャラクターを追ってくる方向に応じて左右にスプライトを Flip (反転) させます。

追加した条件式で The X Position of Target > Object.X() を使っています。これは設定画面では以下のようなものです。

Target は追跡対象、Object は Behaviour が付いているキャラクター、つまり追跡者自身です。

よって、この式は「追跡対象の X 座標が追跡者の X 座標より大きい」と解釈できます。そして、この場合はスプライト画像を反転しません。

逆にもう一つの条件式である The X Position of Target < Object.X() は、「追跡対象の X 座標が追跡者の X 座標より小さい」つまり、追跡対象が左、追跡者が右のポジションに入れ替わるため、スプライト画像を反転します。

ここでは、追跡対象 (Target) と追跡者 (Object) の位置関係 でスプライト画像を反転させるかを決めていることを留意してください。実はここでは、追跡者が実際にどっち方向に進んでいるかは関係ありません。

Forever_Escape Behavior を作成

どの Extension にいれるかは自由です。今回は Forever_Chase と同じ Extension に入れました。

EscapeFromTargetFunctionAction で作成しています。

Behavior properties の追加

Forever_Chase の時と同じく、Speed のみです。逃走スピードに使います。

EscapeFromTarget の実装

Parameters

追加したのは #2Target だけです。逃走する対象(その対象から離れようとする)を指定します。

Configuration

パラメータを追加したので、Configuration も編集します。

Events

まず、1行目の Move Object toward Target with an instant force of -Speed に関してです。
これは、Forever_Chase の実装に対して Speed-Speed としただけです。つまり「対象に対して向かう力を加え続けるのが追跡、対象に対して離れる方向に力を加え続けるのが逃走」ということです。

対象との比較ではなく、自分に力が加わる方向に反転する

改めてスプライト画像の反転、つまり Flip している箇所を抜き出します。

先ほどの Forever_Chase の方では、「Target との X 座標の位置関係」から反転するかどうかを判定していました。

しかし今回は逃走なので、単純にこのキャラクターが逃走する方向に向けるようにしています。(実際には Target との位置関係で方向が変わるので、見た目の動きは変わりません)

反転するタイミングの判定方法をもう一つ

上記は EscapeFromTarget の Events のもう一つの実装例です。

ここでは反転するための判定のために「自身の直前の X 座標 (PreviousXPosition)」を保持しています。Behavior property としては以下のようになります。

4つ目のイベント「(Invert) The property value for the PreviousXPosition of Object = Object.X()」の条件は、「自身の直前の X 座標と、現在の X 座標が等しくなければ」ということです。
つまり、少しでも移動していれば、 PreviousXPosition を更新しています。

そして、2つ目、3つ目のイベントが「どちらの方向に移動しているか」の判定になります。それに応じて、Flip するかどうかを決定しています。

紹介はしましたが、今回は Force を使って移動させているので、前述の Object.ForceX() を使うので必要十分ではないかと思います。

他にもいい方法があるのではないかと調べていたのですが、たどり着かずで、今回はこれらの方法としました。

各種設定 & 動作確認

シーンの設定

【GDevelop 基礎 08】ずっと追いかける (他のオブジェクトとの関連を作る) - Make Everything Games に加えて Excaper を加えています。Player, Chaser に関しては、これ以降の設定も特に前回からの変更はありません。

Escaper の設定

Foreve_Escape を追加しているだけです。冒頭のGIF を撮影するために Speed はかなり遅くしています。

イベントシートの設定

前回に加えて Escaper の設定を追加しているだけです。

動作確認

後は、シーン上に Escaper を追加で配置し Preview を開始すれば冒頭のGIF 画像のように、動く Player に対して Escaper が逃げていくという状態になります。
Chaser に関しても、Player との位置関係でスプライト画像が反転するのが確認できると思います。(冒頭の GIF はもう一つの反転タイミング判定方法のテストもしているので、もう一体 Escaper がいます)

【GDevelop 基礎 08】ずっと追いかける (他のオブジェクトとの関連を作る)

今回作成するもの

これまでは一つのキャラクター に対しての処理を書いてきましたが、今回は初めて複数のキャラクターが関係します。

今回は上記の画像のように逃げるプレイヤーキャラクターを追跡してくるだけのスクリプトになります。

Forever_Chase Behavior を作成

今回は新しく Forever_Chase Extension を作成し、そこに作っていますが、既存の Extension に入れてもらっても問題ありません。

今回は ChaseTarget という Action を追加しています。これは Function です。いつもの doStepPreEventsLIFECYCLE METHODS ですが、Actionは先頭にあることが分かります。

プロパティの追加

追跡する時の速度をプロパティとして持ちます。

ChaseTarget の実装

Parameters

#0, #1 は自動で追加されるものです。手動で追加しているものは #2Target パラメータだけになります。
これが、追跡対象になります。

Configuration

パラメータを追加したので、Configuration も編集します。

Sentence in Events SheetChase target _PARAM0_ and _PARAM2_ を追加します。

このパラメータの説明の書き方については、以下の公式ドキュメントも参照してみてください。
基本的には全てのパラメータを列挙すべきだと思うのですが、今回のケースで _PARAM1_ を書かなくていいのは、おそらく _PARAM1_ がこの関数が含まれる Behaviour の名前になっているので、省略可能なのかもしれません。

Events

追加しているのは Move Object toward Target with an instant force of Speed pixels だけです。 return value の部分は最初から書いてありましたし、今回はこのように常に true を返すようにしておきます。

以下に Move Object toward~ の設定画面を載せておきます。

各種設定 & 動作確認

シーンの設定

上記のように2つの Sprite を配置します。

Player の設定

Player の設定は 【GDevelop 基礎 06】キーを押すと移動する ~斜め移動の速度の修正~ - Make Everything Games で作成した OnKeyPress_Move_Fiexed を追加しているだけです。

Chaser の設定

こちらが追いかける側、つまり追跡者です。

作成した Forever_Chase を付けるだけです。Speed に関しては、 Player より小さくしてください。

イベントシートの設定

これは初めてになりますが、イベントシートにイベントを追加します。

Chaser から呼び出せる ChaseTarget 関数を使って、その Target を Player に設定します。

Chaser から呼び出せるのは、Forever_Chase Behaviour が付いているからですね。

動作確認

後は、シーン上に Player と Chaser を配置し Preview を開始すれば冒頭のGIF 画像のように、動く Player に対して Chaser が追いかけてくるという状態になります。

なぜ Function やイベントシートを使ったか?

how-to-make-behavior - GDevelop documentation

上記の公式チュートリアルが詳しいので、そこから引用します。

さて、この辺でもう少し先に進んで、あるオブジェクトと他のオブジェクト、たとえばプレイヤーと敵を関係させるようなロジックを作成してみます。

今回は「doStepPreEvents」を使えません。この関数内からはビヘイビアが追加されたオブジェクト以外の他のオブジェクトにアクセスできないからです。いま必要なのは、アクションとして使えるような新しいビヘイビア関数です。


この時点で、あなたはがっかりしているかもしれません。「イベントシートにイベントなんか追加したくないのに」、と。今のところ、ビヘイビアにはオブジェクトを渡せませんが、これは将来改善される可能性があります。

これまで使ってきた doStepPreEvents はそもそもパラメータが取れません。加えて、Behaviour はプロパティにオブジェクトを指定することもできません。よって、今までやってきた方法では今回のような「他のオブジェクト」とのやり取りは実現できません。

一方で、今回利用した Action のような Function はパラメータとしてオブジェクトを取ることはできますが、あくまで「呼び出されることで処理をする」ものなので、毎フレーム自動で呼び出しが期待できる doStepPreEvents のような使い方ができません。よって、代わりにイベントシートを使ったのです。
(当然ながら、Behaviour の doStepPreEvents からも Function は呼び出せますが、 いずれにしろそこに渡すオブジェクトにアクセスできないので意味がありません)

「将来改善される可能性」とあるのでそれが実現されれば、Unity のコンポーネントのように GameObject を直接受け取って、それを追跡するような処理が書けるようになると思います。

【GDevelop 基礎 07】Physics Engine で衝突する

今回作成するもの

Unity や Unreal Engine では Collision のように呼ばれることが多いですが、GDevelop でも同じことができます。

今回は Physics Engine (2.0) と、Platformer 関連の Behavior を使った方法でまずは簡単な方法を見ていきます。

Scene にキャラクターと床用タイルのスプライトを読み込む

床用タイルの読み込み

タイル状に正方形の画像を並べることができるように、以下の Tiled Sprite で読み込みます。(日本語だと タイルスプライト です)

今回は Platformer Art Buildings · Kenney のタイルを利用しています。

床用タイルの利用

読み込みが終わり、シーンにドラッグ&ドロップします。そうすると、32px 四方の小さな正方形が表示されます。

このままだとキャラクターに対しても小さいので、2倍して 64px 四方にします。

後は伸ばしたい方向の辺にカーソルを持っていけばカーソル表示が変わるので、好きな方向に伸ばします。

床用タイルは好きなように配置してください。衝突を確かめるために壁も作っておいてください。

シーン内でタイルのコンテクストメニューから Duplicate するか、Ctrl +D すれば Scene Object としては一つのままで、タイル用のオブジェクトを増やすことができます。

Physics Engine を使った衝突可能なオブジェクト

まず PlayerFloor の方を使います。

Player の Behavior

Floor の Behavior

  • Physics2
    • Player との違いは Type: Static な点です。

Platformer の Behavior を利用したオブジェクト

このシリーズでは一つ一つ手作りして動きを作っていますが、パッとゲームを作るなら今後もこちらの Platformer の動きを使った方が早いです。

こちらは PlayerPlatformerFloorPlatformer を使います。

PlayerPlatformer の Behavior

PlatformerObject はデフォルトでジャンプ等もできます。

今回の変更点はスクリーンショットの一番下の Max. speed120 にして、先程の Player の方の速度と合わせている点だけです。

FloorPlatformer の Behavior

Platform の方は何も手をいれる必要はありません。

動作確認

今回はそれぞれの入力を分けていないので、どちらも左右キーで動作します。壁にはぶつかって停止し、床から落ちると角度を変えずに落ちていくのが確認できると思います。

角度を変えずに落ちるのは Fixed Rotation の影響です。

PlayerPlatformer は方向を変えた時に画像が反転していませんが、こちらに関しては今回は触れません。