Unityでネットワークゲームを創りたい(UNET)-20

はじめに

ようやくネットワーク対戦としての主砲砲撃戦が始められたのですが、解決すべき問題が幾つかあります。また新たな課題も出てきました。ということで今回も足踏み状態です。本当にいろいろと知らなければならないことがたくさんあります。困ったものです。

戦艦主砲砲弾の命中時の損害処理

元となるTANKSNETWORKINGアセットのどこの部分でどう損害処理を実施しているのかの調査にかなりの時間を取られました。

①タンク砲弾に付加されたスクリプトshell.csの中で衝突検知を行っています。

②衝突検知時に、使っているタンク砲弾の種類に対応した爆発定義に従った動作をします。

Asset/Prefab/Explosions/SettingData/ この下のbasicShellというファイルの中に爆発の影響範囲や強度、そして発生ダメージの最大値とかが定義されていますが、これを引数にして、ExplosionManager(爆発管理クラス)の中のSpawnExplosion()という爆発処理メソッドを呼び出します。

③SpawnExplosion()では、衝突を検知した場所から、爆発影響度設定の中の影響距離の範囲内にあるコライダーをすべて検出します。

Collider[] collider = Physics.OverlapSphere(pos, radius, mask)

という関数一発で付近のコライダーを一括抽出できるのですね。これは便利。コライダーの親オブジェクトを指定すれば、周囲にあるオブジェクトを検出できます。

④SpawnExplosion()では、一括検出した爆発地点付近のオブジェクト達の中からIDamageObjectというコンポーネントを持つオブジェクトだけを抽出して損害発生処理を行います。ここがまたはまりました。シーン内のオブジェクトでIDamageObjectというコンポーネントを持つものを探しても見つかりません。かなり時間を取りました。

そしてようやく気が付きました。前にも似たものはありました。継承関係を見ていないことです。これまでに使っているタンクの砲撃や移動等に関して損害に関連するコンポーネントはどれかと考えると、TankHealthというコンポーネントがあります。ヒットポイント管理ですかね。このスクリプトTankHealth.csを見ると下記のようにIDamageObjectを継承していました。

public class TankHealth : NetworkBehavior, IDamageObject

これで砲弾が爆発した場所の近くにあるオブジェクトでTankHealthコンポーネントを持つオブジェクトがダメージを受けるということがわかりました。

同時にこのExplosionManager内で、発生した爆発をサーバー経由で全てのクライアントに連絡する機能も創られています。DoLogicalExplosion()です。

まあ詳細はいろいろありますが大きな流れはこのようにしてネットワーク対戦として損害処理を実現していました。今後はこの損害発生昨日を自分のアプリ向けにアレンジしていくことになります。まあ原理が見えてくれば道は自ずと開かれるでしょう。

ネットワーク対戦の課題

①ネットワーク対戦プレイヤーからの主砲砲弾命中処理

主砲砲弾の命中処理がなんかおかしい。当っているはずなのに爆発パーティクルが出ないことがある。とか..自作アルゴリズムでの命中判定であり、Transform.InversTransformPointを使った処理なのだけど、なんか根本問題がありそうなので、もっとシンプルな方法に変更しました。これの調査と対応でだいぶ時間が取られました。

②ネットワーク対戦プレイヤー戦艦の主砲砲塔制御が動かない

ありゃりゃ、ネットワークプレイヤーが操作する戦艦の主砲砲塔が動いていないことに気が付きました。これは問題です。初期検討でこの組み合わせが抜けていました。

ネットの向こう側のプレイヤーが戦艦主砲の照準を行って主砲砲塔を動かしているときに、その情報をネットのこちら側に伝えなければいけないのですがこれが抜けていました。

大元のTANKNETWORKINGアセットのタンクでは実現できていたようなので、その動作を良く調査して創りこむ必要があります。

良くわかったのは、ネットワークの向こう側のプレイヤーの操作をこちらに伝えるというのはなかなか難しいということです。直観的でないからですかね。こちらの操作を向うへ伝えるのはいつでも気になるのですけど逆は難しいです。

同じ理由なのですが、向こうから撃たれた主砲砲弾達の分散度合が思惑とは異なる動きとなっています。理由は主砲砲塔制御が動作していなことに依存します。同じ理由ですね。

継続して実施すべきこと

なんかだんだん煮詰まってきつつあるように思います。なぜかといえば、ネットワークゲーム的要素がだんだん盛り込まれてきていることです。結局やっていることは、何か問題が発生するとその関係の処理がどのようにして動いているのかをゼロから積み上げ菜から理解していくということです。これをやらないと使える処理にはならないからです。

まあとにかくこのあたりの作業を継続実施してネットワーク対戦要素をすべて動かしていくことが最優先と考えます。

現在できていることの整理(進展無し)

1.3種類までの軍艦を選択して登場できる仕組み

2.シングルモードで戦艦を自在に操艦操作する

3.ネットワーク対戦モードで戦艦を自在に操作する

4.主砲射撃制御:戦艦主砲による同時斉射処理およびパーティクル創りこみ

5.スマホ上でのタッチ処理による操作

6.シングルモードでのプレイヤー戦艦の主砲照準と射撃処理

7.ネットワーク対戦モードでの敵戦艦の主砲射撃処理(新規)

8.今回創りこんだ戦艦周りの各エフェクトのネットワーク対戦での確認(新規)

現在できていないことの整理

0.新規【最優先】unityハングアップ問題の回避策獲得

1.インターネット接続を想定した遅延時間増の場合の動作調査

 

次に実現を検討すべきことを考えてみる

ネットワーク対戦モードの動作実現(継続)

最後に

やはり難しいな。これは大変です。人様の創ったプログラムの動作を調べるのは本当につまらない作業です。フラストレーションたまる。でもそうしなければネットワークゲームは創れないのです。UNETでは特にね。まあ1回はやってみたいようにも思います。

以上

参考:海戦関連のアプリを紹介しておきます。

戦艦決闘空間:何といっても第一人気です。

   

潜水艦決闘空間:最新アップデートでかなり好評価されています

 

空母決闘空間1942:かなり良くできていると評価を頂いています