【Unity4】一人称視点ダンジョン、リファクタリング

昨日、フェードイン・フェードアウトをiTweenを使用して実装したことを述べた。

iTweenは、オブジェクトのアニメーションを楽に見栄えよく行うためのライブラリだ。

せっかくなので、今日はずっとスクラッチで実装していた一人称視点の移動もすべてiTweenを使用して実装するようにリファクタリングした。

もちろん、目的はそれだけじゃなくて、これからイベントやエンカウントを実装していくなかで、ゲームシステムの見直しを図った。

大きな変更点としては、ゲームの核となるメインループをひとつのステートマシンとして実装した。

このステートマシンは、GUIなど外部のゲームオブジェクトとは疎結合にして、コマンド受付の窓口インターフェースを設ける。

GUIなどプレイヤーの入力を直接受け取るオブジェクトは、このステートマシンに前進とか右旋回、後退、などのコマンドを非同期で好きなときに好きなだけ送信する。

一方、ステートマシン側は、最初に来たコマンドを受け付けると、いったん窓口を閉めてトランザクションを開始する。

トランザクションは、すべてのコマンドにたいして一般化されていて、例を挙げると次のようなフェーズを順次経ていく。

入力ロック、あたり判定、物理状態更新(主に移動)、イベント判定と処理、エンカウント判定と処理、リアクション(呼び元へのコールバック)、状態リセット、入力ロック解除、とこんな流れだ。

ステートマシンはコマンドをシーケンシャルに処理して行き、トランザクション内の状態の一意性は保障される。

こうすることにより、複雑な処理分岐を意識せずに、各フェーズ単位でいま現在の状態で何をなすべきかに集中したロジックが組めるのである。

具体例で言うと、マップ座標4の3に移動した後、そこに落とし穴のイベントが指定されていたらダメージ処理を行い、その結果がAならば・・・というように、一枡の移動だけでも処理分岐は無数に考えられる。

これらを一連の手続きとしてプログラムを組む代わりに、すべてのコマンドに同じライフサイクルを適用する。

移動のフェーズでは、マップ座標4の3への移動のみを行い、ステートを変化して次のフェーズへバトンタッチする。

イベント判定と処理のフェーズでは、現在のステート(座標4の3)を見て、イベントを判定しイベントが存在すれば、そのイベントに対して処理を委譲する(もちろんその際にもステートが変化する)。

ダメージが大きくて、命を失ってしまった場合は、幾つかのフェーズをスキップして、呼び出し元にゲームオーバーであることを伝えて(リアクションフェーズ)、トランザクションを終了するかもしれない。

上記のような実装方法は、ゲーム業界の標準というわけではない。

俺がまだSEとして業務アプリを開発していた頃の経験から来たものだ。

それでも、これからイベント処理やエンカウント処理を追加していく目処を立てることが出来たので、あながち間違ってはいないと思う。

5年前

コメントを残す

メールアドレスが公開されることはありません。