はじめに
ほとんどの時間を人様コード調査に使っているため昨日からの進展は少ないのですけれど、まあそれでもシングルユーザーモード(ネットワーク対戦モードではないという意味)において敵戦艦が動いて主砲を撃ってくるところまで到達しました。詳細はまだまだ調整が必要ですがまあ少し動いたので良かったです。その内容をちょっと報告させて頂きます。
シングルプレイヤー敵戦艦動作創りこみ(続)
考えてみれば、ネットワーク対戦ゲームにおいてシングルプレイヤーモードでの敵戦艦の動作は少し特殊な機能となります。あらかじめ動作をプログラムで創りこまねければなりません。AI的な処理を創りこむ必要がありますからね。詳細は最後の段階で敵戦艦動作を戦略的、戦術的に組み込まなければなりませんが、まずはその土台となる敵戦艦の基本動作を創りこみます。
シングルプレイヤー敵戦艦の砲撃の仕組み
結局オリジナルのTANKSNETWORKINGアセットのシングルプレイヤーモードでの敵戦車の動きの解析の作業が重要となります。
敵戦車にアタッチされているTurretというスクリプトでプレイヤー戦艦への砲撃照準を合わせて砲撃する処理を行っています。
①DoTargeting(), ②RotateTurret(), ③RangeCheck(), ④AssessAndFire()という順番でプレイヤー戦艦の砲撃を準備しています。砲撃をする際に最初に①でプレイヤー戦艦への照準合わせを実行します。その際に砲弾が着弾するまでの時間の間にプレイヤー戦艦がどの方向にどれだけ移動するかを予測して照準を合わせる処理を行っています。まあこれは当たり前なのですが、この処理のために必要な幾つかの情報があります。プレイヤー戦艦の現在位置と進行方向と速度、そして大砲砲弾の初速です。これらの情報を敵戦艦にアタッチされたTurretスクリプトから入手する必要があるのですが、その仕組みが複雑な仕組みとなっています。
GameManagerの中にタンクのリストがあります。s_Tanksという名前のリストで、この先頭にプレイヤー戦艦の情報が入っています。なので、ここからプレイヤー戦艦の情報を入手します。プレイヤー戦艦情報の中に、戦車の移動動作をマネージメントするTankMovementというクラスがアタッチされています。ちなみに戦車の大砲砲撃をマネージメントするのはTankShootingというクラスです。
このTANKSNETWORKINGアセットの広大なプログラムの中では、戦車の移動動作に関する処理はすべてTankMovementクラスで管理されているようです。速度を入手するためには、TankMovement.speed, 進行方向指定のためには、TankMovement.SetDesireMovementDirection(Vector2 moveDir)、動かすためのMove(), 回転のためのTurn()等々です。
既にプレイヤー戦艦の移動動作処理でTankKeyboardInput()処理の中に創りこんだ処理が既にこのTankMovement処理の枠組みから外れているので少し対応方法を検討する必要がありますが、まあなんとか基本動作の部分を創りこむことができました。
敵戦艦(レパルス)がプレイヤー戦艦(大和)を一定間隔で砲撃をするようになりました。敵戦艦であるレパルスの主砲射撃の砲撃パーティクルや大砲主砲砲弾の飛翔処理、艦船移動の航跡等々がようやくまとまって動き始めました。
継続して実施すべきこと
敵戦艦の航行アルゴリズムの構築、敵戦艦の主砲照準と射撃のアルゴリズムの構築を進めるのが良いと考えます。これが実現できれば、ネットワーク対戦モードでの敵戦艦からの砲撃処理も同時に実現できる可能性が高まります。
現在できていることの整理
1.3種類までの軍艦を選択して登場できる仕組み
2.シングルモードで戦艦を自在に操艦操作する
3.ネットワーク対戦モードで戦艦を自在に操作する
4.主砲射撃制御:戦艦主砲による同時斉射処理およびパーティクル創りこみ
5.スマホ上でのタッチ処理による操作
現在できていないことの整理
1.インターネット接続を想定した遅延時間増の場合の動作調整
2.今回創りこんだ戦艦周りの各エフェクトのネットワーク対戦での確認
次に実現を検討すべきことを考えてみる
今回の継続でシングルプレイモードでの敵戦艦との砲撃戦の実現(続)。その次にネットワーク対戦としての砲撃戦でしょう。
最後に
200以上のスクリプトが存在する巨大プロジェクトのプログラム構造理解は大変ですが、だんだんにその改造するためのアプローチ法が確立しつつあるようにも思います。まだまだ長い道ですが先へ進みたいと思います。
進展があればここでまた報告させて頂きます。
以上
参考:海戦関連のアプリを紹介しておきます。