はじめに
やはり人様のコードは本当にわかりにくいです。そのコードはunityのトッププロが創った最高のコードであることはわかっていてもです。どこに何があってどうつながっているのかの探索が本当に大変です。ちょっと気持ちがくじけがちな今日この頃です。
今回はシングルプレイヤーモードでの敵戦艦の登場とその射撃制御関連の創りこみです。まだ途中ですがようやく光が見えてきたところです。
シングルプレイヤーステージ構成
シングルプレイヤーステージ(トレーニングステージとメニューにはあります)は10のステージで構成されています。これまで使っていたシングルステージは最初のステージであり一番簡単なステージであったため、敵の戦車は出てこなかったのです。なので、これは使えませんでした。よって、今回はステージ5をコピーして編集することにしました。敵の戦車は3台出てきます。まあこれを使って先へ進めます。
例によって、地形や樹木や塀や建物等のオブジェクトを地下へ隠し、海プレファブを導入して、スカイボックスをセットして大海原を実現しました。
敵TANKの構成
ステージのHierarchyビューの中にLevelというステージの各種アセットを格納する場所があります。この中に静的なものと動的なものが分離されて設置されています。
この動的な部分の中にTanks親トランスフォームがあります。この下に3台の敵戦車がいました。BossTank, BossEscort, BossEscort(1)とあります。この中身を見ると戦車プレファブに対して幾つかの敵戦車専用のスクリプトがアタッチされていました。TargetNPC, Navigator, Turret, DamageOutlineFlashというものです。
Navigatorというのが敵戦車の移動を制御しているようです。どうも戦車の動作を見るとその動作はあまり使えないので、敵戦艦の移動処理は自分で創らんとだめでしょう。ですが、主砲射撃はネットワーク対応のこともあるので、まあ合わせておこうと考えています。
Turretというスクリプトに敵戦車の大砲射撃の制御処理が書かれていました。自戦艦の大砲処理であるTankShootingと内容が似ています。ここに自戦艦での主砲発射処理で創りこんだものを移植する必要があります。
TANK大砲射撃処理の演算について
TANKSNETWORKINGアセットでは元々大砲射撃処理演算を行っています。この処理はネットワークアプリのための各種同期処理と密接に関連しているはずですので、基本的にはこれを使うしか選択肢は無いと考えています。
なのでその方針で進めているのですがどうも変なのです。大砲の砲弾の速度が変化するように見えるのです。普通は大砲の砲弾の初速は一定で大砲の仰角を変えることで射程距離を制御するはずです。どうもこれが成り立っていないのです。なので、自分の戦艦の主砲の砲塔仰角がなんかおかしい。
大砲射撃処理をどこでやっているかと見ていくとstatic宣言されているFiringLogicという処理がある。ここでFiringLogic.CaluculateFireVector()という処理で大砲砲弾の初期速度ベクトルを求めていました。そして残念なことに砲弾の速度は可変になっているのです。戦車ゲームだからどうでも良いのでしょうね。
結論として、同じ場所に自分専用の主砲砲弾初速を一定にした状態での大砲砲弾の初速ベクトルを求める関数を創って、大砲を撃つ処理のところで、この関数に置き換えるようにしました。まあこれで戦艦決闘のための主砲射撃のベースができそうです。
敵戦艦の準備
まあここまでやってきましたので、敵TANKの代わりに敵戦艦を準備しました。今回はレパルスを使います。最初にTANKプレファブを創ったのと同じように敵戦艦を創りました。前に創ったTANKプレファブはネットワークマネージャによってspawnされるものです。ですが、シングルプレイヤーモードでの敵戦車はベタでシーンに付属で創りつけで大丈夫です。そういう構成でした。なので、敵TANK(Mastodonというタンク)にレパルスのプレファブを付加して敵戦艦を創りました。戦艦プレファブには主砲射撃制御用にbattleship_houtou_controlというスクリプトを創ってアタッチしていますが、敵戦艦の場合と自戦艦の場合を区別する変数を準備してシーン構成時に選択できるようにしました。
敵戦艦との決闘シーン動作確認
まだ敵戦艦からの戦艦主砲砲弾発射処理は創りこんでいませんが、敵戦艦のベースとなるタンクからの砲撃は可能な状態で動作確認を行いました。
向うの矢印そばにいるのが敵のレパルスであり、その左に見える小さな点は敵から撃たれた砲弾です。敵戦艦のTurretスクリプトの射程距離や射撃感覚タイマー等を変更することでまあそこそこ戦艦同士の決闘的な雰囲気は出てきました。
継続して実施すべきこと
敵戦艦からの主砲射撃処理を創りこむ必要があります。まあ今回の分析でその方法もだいぶ見切れたうえで、必要なbattleship_houtou_controlの処理の変更処理も行いましたのでなんとかなるのではないでしょうか。明日実施する予定です。
現在できていることの整理
1.3種類までの軍艦を選択して登場できる仕組み
2.シングルモードで戦艦を自在に操艦操作する
3.ネットワーク対戦モードで戦艦を自在に操作する
4.主砲射撃制御:戦艦主砲による同時斉射処理およびパーティクル創りこみ
5.スマホ上でのタッチ処理による操作
現在できていないことの整理
1.インターネット接続を想定した遅延時間増の場合の動作調整
2.今回創りこんだ戦艦周りの各エフェクトのネットワーク対戦での確認
次に実現を検討すべきことを考えてみる
今回の継続でシングルプレイモードでの敵戦艦との砲撃戦の実現。その次にネットワーク対戦としての砲撃戦でしょう。
最後に
本当に人様のコードの理解には時間がかかります。おまけに理解しても後で自在には使いこなせるようには思えません。まあそれでも技術的にはとてもじゃないけどネットワークゲーム実現は難しいので、なんとかこのブラックボックス作戦で進めたいと考えています。
進展があればここでまた報告させて頂きます。
以上
参考:海戦関連のアプリを紹介しておきます。
戦艦決闘空間:何といっても第一人気です。
潜水艦決闘空間:最新アップデートでかなり好評価されています
空母決闘空間1942:かなり良くできていると評価を頂いています