【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 を直接受け取って、それを追跡するような処理が書けるようになると思います。