今回作成するもの
これまでは一つのキャラクター に対しての処理を書いてきましたが、今回は初めて複数のキャラクターが関係します。
今回は上記の画像のように逃げるプレイヤーキャラクターを追跡してくるだけのスクリプトになります。
Forever_Chase
Behavior を作成
今回は新しく Forever_Chase
Extension を作成し、そこに作っていますが、既存の Extension に入れてもらっても問題ありません。
今回は ChaseTarget
という Action を追加しています。これは Function
です。いつもの doStepPreEvents は LIFECYCLE METHODS
ですが、Actionは先頭にあることが分かります。
プロパティの追加
追跡する時の速度をプロパティとして持ちます。
ChaseTarget の実装
Parameters
#0
, #1
は自動で追加されるものです。手動で追加しているものは #2
の Target
パラメータだけになります。
これが、追跡対象になります。
Configuration
パラメータを追加したので、Configuration も編集します。
Sentence in Events Sheet
に Chase target _PARAM0_ and _PARAM2_
を追加します。
このパラメータの説明の書き方については、以下の公式ドキュメントも参照してみてください。
基本的には全てのパラメータを列挙すべきだと思うのですが、今回のケースで _PARAM1_
を書かなくていいのは、おそらく _PARAM1_
がこの関数が含まれる Behaviour の名前になっているので、省略可能なのかもしれません。
- Functions - create your own actions, conditions or expressions - GDevelop documentation
- 関数 - GDevelop documentation
- 日本語サイトは多少情報が欠けているので英語の方を翻訳して見たほうがいいかもしれません
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
を直接受け取って、それを追跡するような処理が書けるようになると思います。