[GameDev]イベントのトリガー その1

イベントを実行する条件をとりまとめる部分の実装。

要件

イベントが発動する条件は下記のとおり。

・足元への接触

プレイヤーがタイルを踏んだ時に実行。

・対象への近接

キャラクター、オブジェクトに近づいたときに実行。

・近接、接触の解除

キャラクター、オブジェクト、タイルから離れたときに実行。

・近接後クリック

上記の近接時、さらにクリックすることで実行。

・対象への精霊アクション

キャラクター、オブジェクト、およびタイルに精霊アクションを当てたときに実行。

実装方法

トリガーの対象となるオブジェクトにアタッチするコンポーネント「EventHandler」、
プレイヤーにアタッチするコンポーネント「EventTrigger」を作成。

・EventHandler

上記のイベント発動条件の成立時に実行するイベントスクリプトを格納する。
格納するのみで、こっちでプレイヤーとの接触判定は行わない。

・EventTrigger

プレイヤーの足元および周囲に、EventHandlerを持つオブジェクトがいるかどうかを調べる。
周囲への接触判定を行うRayCastはそれなりに重い処理だそうで、
・足元:ある程度移動した場合
・周囲:指定秒に1回
と、ある程度タイミングを間引いて実行する。
足元と周囲の判定タイミングが異なるのは、周囲の場合、相手から寄ってくる可能性があるため。

実装

足元と周囲にRayCastする

・足元

赤いラインが飛ばされたRay。とりあえず半歩進むごとに飛ばすように。

・周囲

白い◇が飛ばされたRay。階段を誤検知しないように、地面よりちょっと上に飛ばす。

この範囲に入ったオブジェクトのうち、一番プレイヤーに近いEventHandlerがアタッチされたオブジェクトを取得する。


▲タイルに対して踏み


▲キャラに対して接触

…とりあえずココまで。

番外編

インスペクタを拡張してみる


▲素の状態。記述し辛い


▲拡張後。


▲こんな感じで、より記述しやすいように。


▲よく使うであろう命令は、追加時にテンプレートを使える。

ここまでやってみたはいいものの…。

よくよく考えると、インスペクタからイベントトリガーの設定をすると
都度アセットバンドルのリビルド→アップロードが必要になると気付く。
コレもイベントスクリプトから設定できるようにしたほうが良いな…。