オブジェクトのビヘイビアを作成する方法

ゲームが発展しはじめたら、あるいはゲームを作りはじめてすぐの時点でさえ、ゲームロジックを可能な限りカスタムビヘイビアで組織化するのはいい考えです。そうすることでイベントシートのイベント数を減らし、ゲームロジックの取捨選択を容易にします。

自分のゲームオブジェクトのためにわざわざカスタムビヘイビアを作成するのは、イベントシートに直接イベントを作成することと比べて面倒に思えるかもしれません。特に最初のうちはそうです。 ビヘイビアはより制約も多く、オブジェクトがどう機能して、どの条件とアクションをビヘイビアに公開するかについて、慎重に検討する必要があります。しかし一方でカスタムビヘイビアはとても強力なツールでもあり、ロジックをオブジェクト内にカプセル化して、イベントシートを可能な限りミニマムに保ってくれます。

経験豊かなゲーム開発者であっても、ゲームをできるだけカスタムビヘイビアで構成することをお勧めします。

この記事では次の内容を説明します。

  1. オブジェクトのシンプルなビヘイビアを作成する
  2. そして他のオブジェクトとやり取りする方法
  3. 最後にカスタムの他のビヘイビアとやり取りする方法

1. ビヘイビアを使って「オブジェクト用」のイベントを作成する方法

最初にプロジェクトマネージャーからビヘイビアを格納するための拡張機能を作成します。名前は自由につけてかまいません。拡張機能には何かのゲームオブジェクトに関連したビヘイビアをまとめることができます。

拡張機能の編集画面を開き、この拡張機能内に新しいビヘイビアを作成します。オブジェクトにちなんだ名前にするか、これから作る機能に沿って名づけます。

ビヘイビアが何をするかということを要約した名前をつけられれば一番です。しかし最初のうちはそれがはっきりしないかもしれません。ビヘイビアの名前はあとでいつでも変更できます。

ビヘイビア関数パネルの新しい関数を追加をクリックします。

「doStepPreEvents」ビヘイビア関数を追加します。

このビヘイビア関数(ビヘイビアメソッドとも)は、フレームが画面にレンダリングされるたびに毎回ゲームエンジンによって自動的に呼び出されます。オブジェクトを更新するイベントを追加するのにはちょうどよい場所です。

追加した関数は、ビヘイビア関数リストに表示されます。

これで内部イベントを追加できるようになりました。今回のサンプルには、次の 2 つのイベントを追加します。

  • スペースキーが押されたらシーンの背景色を変更するもの
  • ボタンが押されたらサウンドを再生するもの

もちろん、シーンの背景色の変更はふつうビヘイビアでやるようなことではありません。でもビヘイビアがちゃんと動作しているかどうか確認するには、一番簡単な方法です。

動作が複雑な「本物の」ビヘイビアでは、オブジェクトを更新するためにビヘイビアプロパティや変数を使ってもいいでしょう。たとえば「doStepPreEvents」関数でオブジェクトを移動することができます。

ではゲームシーンに戻って、いま作ったビヘイビアをオブジェクトに追加してみましょう。 最初にビヘイビアを追加するオブジェクトを検索します。

オブジェクトを編集して、「ビヘイビア」タブからオブジェクトにビヘイビアを追加を選択します。

リストから先ほど名前をつけたビヘイビアを選択します。ビヘイビアに説明がないことに気づくと思います。拡張機能エディターからビヘイビアプロパティを編集をクリックすると、説明を追加できます。実際のところ、何のためのビヘイビアなのか見て分かるような適切な名前と説明をつけることは、とても重要です。

ではゲームを実行してみましょう。 スペースキーを押すと背景色が変わり、P キーを押すとサウンドが再生されることを確認します。

たとえばスターターのプラットフォーマーゲームでスぺ―スキーを押すと、背景色が緑に変わります。

2. 他のオブジェクトとやり取りする方法

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

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

先ほどのビヘイビア関数パネルから新しい関数を追加を選び、「カスタム(アクション、条件、式)」を選びます。

ビヘイビア関数リストに追加されました。

処理内容に即した名前に変更しましょう。

続いてこの関数に、敵オブジェクトを指定するためのパラメーターを追加しましょう。 新しいパラメーターの型は「Object」にします。それからこのオブジェクトをイベントで使えるようにします。

関数を選択して「パラメーター」タブを選び、下部にある[パラメーターを追加]をクリックします。パラメーターの名前に「Enemy」と入力し、タイプに「オブジェクト」が選択されていることを確認します。ラベルにも「Enemy」と入力しましょう(これはイベントシートにアクションを追加するときに表示されます)。

パラメーターを設定し終わったら、イベントでオブジェクトとして参照できるようになります。 たとえば、プレイヤーが敵と衝突したときにサウンドを再生するようなことができます。

最後に、関数の設定で、いい感じの名前と文を追加しましょう。

最後の手順として、イベントシートから関数を呼び出します。

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

関数呼び出しにはアクションを使います。以前、作成したビヘイビアをプレイヤーに追加したので、イベントシートの Player のアクションで選べるはずです。

イベントシートで Player の(あるいはビヘイビアを追加したオブジェクトの)アクションを追加します。 それからアクション「Handle enemies」を選びます。

最後に操作する敵を設定しましょう。

上の例では「SlimeWalk」オブジェクト単体を選択していますが、オブジェクトグループも指定できます。

結果は次の通りです。

ゲームを実行すると、プレイヤーが敵と衝突したときにサウンドが再生されるはずです。

イベント 1 個だけにしては悪くない効果ですね。その気になれば、もっとたくさんのオブジェクトを追加して、もっと複雑なビヘイビアにすることもできます。あるいは、これをプレイヤーと同じように振る舞う他のオブジェクトに再利用することもできます。プレイヤーが敵と衝突したときにサウンドを再生したくなければ、このビヘイビアを無効にすることだってできるでしょう。

このビヘイビアをどこまで拡張するかは、まったくあなたしだいなのです。

3. 他のオブジェクトのビヘイビアとやり取りしてみよう

仮に、ゲームがかなり複雑になってきたとしましょう。たとえば、敵にも独自のビヘイビアが追加されているものとします。そしてこのビヘイビアは、敵を点滅させるアクションを持っています。 そこで、プレイヤーが敵と接触したときに、敵を点滅させたいと思います(ダメージ演出としては、ヘルスが減るとか、アニメーションを再生するとか、いろいろバリエーションが考えられますが)。

良いニュースとしては、「点滅」ビヘイビアはすでに存在します。拡張機能として利用できるので、キーワード「blink」で検索してプロジェクトにインストールしてください。これを敵に追加しましょう。まず、検索します。

次に、これを敵に追加します。

追加されたら、設定項目を調整します。

ここでプレイヤーのビヘイビアに戻りましょう。HandleEnemies 関数に新しいパラメーターを追加します。タイプは「ビヘイビア」で、「Enemy」オブジェクトパラメーターのすぐ下です。

これは改良すべき箇所です。直前のパラメーターで渡されている Enemy オブジェクトの一部であるビヘイビアをわざわざ別のパラメーターで受け取る必要性は、明らかとはとても言えません。これは将来改善される予定です。

今や関数は敵が「Blink」というビヘイビアを持っていることを知っている状態です。アクションを使って点滅させましょう。

改良すべき個所がまた見つかりました。パラメーターを追加した後イベントシートに戻って、ビヘイビアをパラメーターとしてちゃんと渡すようにアクションを編集しなければなりません。

3 番目のパラメーターが追加されている点に注意してください。これを設定し忘れると、アクションは最後のパラメーターが欠落した状態になり、ゲームが正常に実行されません。

さて、これでゲームを実行すると、プレイヤーが敵と接触したときに敵が点滅するはずです。

まとめ

ここで作成したビヘイビアは単純ですが、カスタムビヘイビアを使うと何ができるかという点について、その可能性を示しています。

作っているゲームを、オブジェクトとビヘイビアの相互作用という観点からとらえなおすことはとても有益です。イベントシートはゲームで起きることの流れを記述する中心地ですが、そこで起きるアクションのほとんどにビヘイビアを使うことができます。