カスタムビヘイビア:イベントで独自のビヘイビアを作成する

ビヘイビアは、何かの定義済み機能を手早くオブジェクトに追加するにはもってこいの存在です。ビヘイビアは使いやすく、複雑な機能でも簡単にオブジェクトに追加できます。もしこれを全部イベントの再作成で行うとしたら、とても面倒な作業になり、イベントシートが汚部屋状態になることでしょう(たとえグループ関数外部イベントを活用したとしても)。

GDevelop では、専用のカスタムビヘイビアを作成できます。標準の組み込みビヘイビアと同様に、カスタムビヘイビアもオブジェクトに追加できます。これを使うとオブジェクトを自動的に操作することが可能になります。たとえばオブジェクトの移動変数の変更、(スプライトオブジェクトの)アニメーション変更、(テキストオブジェクトの)テキスト変更など、通常はイベントで行うようなあらゆる操作がビヘイビアで実現します。

ビヘイビアをどうゲームで使うのかサンプルを見たい場合は、オブジェクトのビヘイビアを作成する方法を参照してください。ステップバイステップの説明と、ビヘイビアを使ってゲームを構築するガイドを読むことができます。

新しいビヘイビアを作成する

ビヘイビアは拡張機能のひとつに分類されます。これは GDevelop の自作できる拡張機能とよく似ていますが、そちらが関数で構成されるのに対して、ビヘイビアはイベントで構成されるという違いがあります。新しく追加した拡張機能も含めて、そのゲームのすべての拡張機能のリストをプロジェクトマネージャーで見ることができます。

下部の[+]ボタンをクリックして、新しい拡張機能を作成します。右クリックから名前を変更できます。同じ目的に関連した関数とビヘイビアはひとつの拡張機能にまとめると良いでしょう。

リストからいま作成したばかりの拡張機能をクリックすると、拡張機能エディターが開きます。デフォルトの拡張機能には何の機能もありません。左のパネルから[新しいビヘイビアを追加]をクリックして追加します。

新しいビヘイビアが追加されました。やりたいことに則った名前に変更しましょう。たとえば、ビヘイビアが敵をプラットフォーム上で左右に移動させるのに使われるなら、HorizontalMovement(英数字とアンダースコアだけが使えます)という名前なんかいいですね。ダメージを管理して、必要に応じて自動的にオブジェクトを削除するようなビヘイビアには、Destructible という名前はどうでしょう。

ビヘイビアを右クリックして[プロパティ]を選ぶと、ビヘイビアの設定を編集できます。説明を入力したり、エディター上の表示名を入力したり、追加できるオブジェクトのタイプを制約したければそれを指定することもできます。

ビヘイビアには、数値や文字列、真偽値などの値をビヘイビア内に格納するプロパティを追加できます。プロパティの追加方法と使い方は、このページの最後の方のセクションで説明しています。

ビヘイビアに関数を追加する

リストからビヘイビアをクリックすると、ビヘイビアを構成する関数のリストを確認できます。ビヘイビア関数リストは右側のパネルに表示されます。

既定では、ビヘイビアは空っぽで何もしません。機能を持たせるために、新しい関数(メソッド)を追加しましょう。ライフサイクルメソッドと呼ばれる定義済み関数とカスタム関数の中から、適切な関数タイプを選択します。ライフサイクルメソッドは、ゲームの実行中に所定のタイミングでゲームエンジンによって自動的に呼び出されます。カスタム関数は条件やアクションで利用可能になります(通常の関数と同じです)。

ライフサイクルメソッド

定義済みライフサイクルメソッドは、以下の種類が存在します。

  • onCreated:このビヘイビアを持つオブジェクトの新しいインスタンスが作成されたときに実行されるイベントです。
  • onStepPreEvents:フレームが画面にレンダリングされるたびに毎回実行されるイベントです。シーンの「通常」イベントが実行される前に呼び出されます。たいていのゲームでは、1 秒間に 60 回になるでしょう。これは当該ビヘイビアが無効にされていない限り、そのビヘイビアを持つすべてのオブジェクトひとつひとつについて、呼び出されます。
  • onOwnerRemovedFromScene:このビヘイビアを持つオブジェクトが削除されたときに実行されるイベントです。もし複数のオブジェクトが同時に削除された場合は、オブジェクト個別にイベントが複数回実行されます。これはビヘイビアが無効になっている場合でも発動します。
  • onDeActivate:オブジェクトのビヘイビアが無効になった後に一度だけ実行されるイベントです。
  • onActivate:オブジェクトのビヘイビアが再び有効になった後に一度だけ実行されるイベントです。
  • onStepPostEvents:シーンの「通常」イベントの後に実行されるイベントです。当該ビヘイビアが無効にされていない限り、そのビヘイビアを持つすべてのオブジェクトひとつひとつについて、呼び出されます。たいていのゲームでは、1 秒間に 60 回になるでしょう。可能であれば、onStepPreEvents の使用を推奨します。ビヘイビアが通常イベントの前に処理を行い、その結果オブジェクトに生じた変更を受けて通常イベントが走るという連携が成立するからです。

これに該当するビヘイビアの例を次に示します。これは onStepPreEvents 内のイベントを使ってひどいダメージを受けたオブジェクトを自動的に削除します。

カスタムアクション、条件、式

ビヘイビア関数の作成時にカスタム関数を選ぶと、通常の関数と同じような設定を行う画面に移行します。それがアクションか条件か式かを指定し、名前を入力し、説明を入力し、イベントシートに表示される文を入力します。

次の図は、オブジェクトにダメージを追加する新規アクションを作成した例です。

オブジェクトのビヘイビアを使う

1) ビヘイビアをオブジェクトに追加する

ビヘイビアを作成したら、次はそれをオブジェクトにアタッチします。これの一番いいところは、イベントベースのビヘイビアは GDevelop 付属の他の「組み込みビヘイビア」とまったく同じようにリストに出てくるという点です。

見てください。これは「Destructible Object」ビヘイビア(前のスクリーンショットで作成していたもの)の例です。

作成したカスタムビヘイビアは、オブジェクトにアタッチされたビヘイビアのリストに表示されます。

ゲームを実行して、「doStepPreEvents」関数(または「doStepPostEvents」)のイベントが実行されるのを確認しましょう。先ほど作成した Destructible ビヘイビアの例では、「Damage」変数が 100 以上であればオブジェクトを自動的に削除するようにしました。

これをテストするために、「Destructible」ビヘイビアを「Platform」オブジェクトに追加します。それからデバッガーを起動し、インスペクターで「Platform」インスタンスを調べて「Damage」変数が 0 であることを確認します。デバッガー(またはイベント)を使って変数に 100 を設定すると、オブジェクトがシーンから削除されます。

2) アクション/条件/式を使う

対応する関数宣言さえあれば、他の「組み込みビヘイビア」と同じく自作したビヘイビアもアクション/条件/式で使えます。たとえば「Destructible」ビヘイビアでは、オブジェクトにダメージを与えるアクションを作成しました。そのアクションをイベントシートで使うことができます。

イベントシートに表示されている状態です。

見ての通り、これを使うととても分かりやすく読みやすいイベントになります。もっと複雑で、他のオブジェクトでも再利用可能なビヘイビアにもすることができます。

ビヘイビアにプロパティを追加して使う

ビヘイビアの興味深い点は、オブジェクト変数のように、関連情報を内部に保持できることです。これはプロパティと呼ばれます。プロパティは数値、文字列(テキスト)、真偽値(チェックを入れたり外したりできる仮想のチェックボックスのようなもの)のどれでも保持できます。

プロパティを使うと、ビヘイビアをカスタマイズすることができます。たとえば速度やダメージ量、ライフ数、パワー数、マナ等々をプロパティとして持ち、その値に応じてビヘイビアの処理を変更するのです。

ビヘイビアにプロパティを追加したり確認するには、ビヘイビアを編集して[プロパティ]タブをクリックします。下図は「Health」というビヘイビアのプロパティを表示した状態です。オブジェクトのヘルス値と、連続してダメージを受ける最小間隔(クールダウン)の 2 つのプロパティを確認できます。

プロパティには次の特徴があります。

  • 数値、文字列、真偽値(チェックボックスとして表示)のいずれかになる
  • 既定値を設定でき、ビヘイビアがオブジェクトに追加された際に値を変更しなければ既定値が採用される
  • オブジェクトに追加されたときにエディター上に表示することも、非表示にすることもできる
  • エディター表示用のラベルを持っている

アクションと条件を使ってプロパティを操作する

ビヘイビアにプロパティを作成すると、ビヘイビア内のイベントシートに、プロパティに対応する条件とアクションが自動で追加されます。各プロパティについて、値を比較する条件と、それを変更するアクションを選択できるようになります。 また文字列と数値については、値を取得するための式も利用できるようになります。

プロパティの名前を変更すると、それを参照するアクション/条件/式も自動的に更新されます。
これらのアクション/条件/式はビヘイビアの外部では利用できません。プロパティはある種の「プライベートスコープ」であり、ビヘイビアによってのみ操作できます。プロパティをシーンイベントからも変更したい場合は、そのための新しいアクション/条件をビヘイビアに作成する必要があります。

ビヘイビアのメリットとデメリット

独自のビヘイビアを作成することには、いくつかのメリットがあります。

  • カプセル化:カスタムビヘイビアの内部にロジックを隠蔽することによって、イベントシートを最小限のイベントで簡潔に保ち、読みやすく、メンテナンスもしやすくなります。ビヘイビアはロジックを実行するアクションと条件と式を持てるため、イベントシートで長い操作を繰り返す必要がありません。他のビヘイビアを使うときと同じように、ビヘイビアが提供するアクション/条件をふつうに使えばいいだけです。
  • 再利用性:たとえば敵を移動させて、プレイヤーに踏まれたらライフを減らすようなビヘイビアを作成したとしましょう。もしまったく新しい種類の敵――ただし基本的な挙動は共通の――を追加したいと思ったら、新しいオブジェクトを作成し、それに同じビヘイビアを、プロパティを変えて追加すればいいのです。何回かクリックするだけで、新しい敵がゲームに登場するでしょう。
  • 共同作業:チームでゲーム制作をしているか、あるいはプロジェクトをオープンソースにして新機能の開発やゲームプレイに参加してくれるコントリビューターを募るとします。カスタムビヘイビアを使うと、誰でも自己完結型の機能とゲームロジックをデザインして、それを簡単にインポートしたり、他の人に使ってもらったりできます。その人がレベルデザイナーやゲームデザイナー相当の知識を持っている必要はありません。ゲーム業界で働いている必要もありません。それをいうなら、そこでは働きたくないと思っている人でも、大丈夫です。
カプセル化と再利用性は、プログラミングの最重要概念です。Unity のような他のゲームエンジンでは、オブジェクトとビヘイビアのことをエンティティとコンポーネントと呼ぶかもしれません。

ビヘイビアの構成しやすさは、今後のアップデートでさらに改善していく予定です。

カスタムビヘイビアのサンプル/アイディア

たぶん皆さんもたくさんのビヘイビアを思いつくでしょうが、ここでいくつか例を挙げておきます。

  • 敵やボスのヘルス値を管理するビヘイビア。
    • 「オブジェクトを攻撃する」アクションと、「オブジェクトは死んでいるか?」条件を使える。ビヘイビアは敵のライフ値を管理するために、オブジェクト変数を更新する(たとえば敵が攻撃されたら、ライフを減少させる。 そして、各フレームごとに少しずつ回復させる)、「オブジェクトは死んでいるか?」条件でライフが 0 になったかどうかをチェックする。
  • ほかのアイディアとしては、敵を複雑なパターンで移動させるイベントをビヘイビア内に作成する。
    • 移動パターンや速度などを変更するためのアクション/条件を追加できる。全部ビヘイビア内に用意して、数クリックでどんなオブジェクトにも追加できる。
  • 敵を撃破したりアイテムを取ったりしたときに、自動的にスコアを更新するビヘイビア。
    • オブジェクトが破壊されたときにスコア変数を増やすビヘイビアを作成する。それから、このビヘイビアを持つアイテムや収集品、敵などを作成して、それらが収集されたり破壊されたときに、スコアを自動で増やす。
ビヘイビアをどうゲームで使うのかサンプルを見たい場合は、オブジェクトのビヘイビアを作成する方法を参照してください。ステップバイステップの説明と、ビヘイビアを使ってゲームを構築するガイドを読むことができます。