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

はじめに

毎度同じ言い訳から始まります。ぜんぜんさぼっている訳ではないのですが、今回はちょっと先へ進めました。具体的にはネットワーク対戦モードへの最低限の機能群が実現できたように思いますので、報告させて頂きます。

ネットワーク対戦モード実現のための根本概念

結果的には根本的な理解不足として、ネットワーク対戦モードでは通常のunityアプリ構築と全く異なり、ネットワーク対戦相手やネットワーク遅延を含めて、全く非同期な遅延が存在し、その条件がすべて揃うまではアプリを動作させてはいけないということです。

あたりまえのことなのですが、ネットワークアプリという難題に直面している中で、そして根本的な対応が必要な課題であったので、そのことを理解して対応するまでにかなりの時間を要しました。

ネットワークアプリでの動作準備完了の違い

通常のアプリであれば、アプリ動作準備を複数のオブジェクトでawake(), start()内で必要な準備作業を設定しておけばupdate()でループ動作スタート時までにはアプリ全体での十分準備ができていることになります。まあこれがあたりまえだと考えて全体を構築しています。

ネットワークアプリではこれが全く異なります。各オブジェクトや処理はawake(), start()で最低限の準備はしますが、これらの高速な処理では、ネットワーク対戦相手の状況や、ネットワーク経由での各種状態更新の遅延や、ネットワーク自体の遅延等によって、ネットワークアプリ全体が動作開始して良い状態になるまでに数秒以上の時間が必要となることがあります。

TANKSNETWORKINGアセットでのネットワーク遅延待ち構築の仕組み

TANKSNETWORKINGアセットでのネットワーク遅延待ちの仕組みは当然いろいろな部分に分散して創りこまれていて全体像は見えにくいですが、これまでここで触れてきたタンクの移動やタンクの砲撃等の処理には簡単な仕組みで創られていました。

対象クラスのupdate()処理の先頭にネットワーク関連の初期化処理完了フラグm_Initializedがセットされていなければ戻る(return)という条件分岐を付けています。このフラグがセットされなければ何も定常処理へは移行しないということです。

一方、マネージャーと称する管理用のクラスからネットワーク系の準備ができると、対象クラスへの初期化処理指示が出て、その中で必要な初期化処理を行うようにするのです。同時に初期化完了フラグm_Initializedがセットされ、これまでスキップされていたupdate()処理が始まるという仕組みです。

これまでは、この待ち時間を待つ前にhasAuthorityを見て処理を実現していたために、間に合ったり、間に合わなかったりして意味不明な挙動となっていました。

まあこのことの重要性が理解できたうえで、最低限のネットワーク対戦機能が実現できたのでまあ結果としては良かったかなというところです。ただし時間はかなり使いました。でも難しいので仕方ないところです。

ネットワーク主砲砲撃戦

ようやく動き出したのでネットワーク主砲砲撃戦の図を紹介します。

プレイヤーは2人です。①unityエディタープレイヤー、②macアプリプレイヤーの二人。

下記の図に示すようにようやくちゃんと砲撃戦が動き始めました。ネットワーク遅延は短い設定であり、かつ直結接続のために、ネットワーク遅延がほぼゼロの状態での動作確認ですが、まあ良く動いてくれているように思います。

macアプリプレイヤーが砲撃する図

unityエディタープレイヤーが砲撃する図

まだまだいろいろ課題はありますが、ネットワーク対戦に必要なコア機能は実現できたようにも思います。という報告でした。

ネットワーク対戦モードで確認できたこと

UNET関連機能をブラックボックス化してアプリ全体を構築するというアプローチがほぼほぼうまく行ったと考えています。

ネットワークプレイヤー制御の戦艦の砲撃では、9つの主砲砲弾、砲撃の煙パーティクルがそして主砲砲弾の着水時の水柱の確認ができました。命中弾処理はちょっと後回しですが。

ポイントは砲撃戦においてネットワーク同期する情報は元となるTANKSNETWORKINGアセットと同じである点です。まあそれが実現できつつあるように思います。

ネットワークプレイヤーの戦艦操艦の確認もできましたし、航跡パーティクルや尖頭波等もうまく動作しています。

UNETブラックボックス化を前提にアプローチしてきたことがまあうまく行っているのかなとは感じております。

継続して実施すべきこと

デバッグ用にいろいろと戻してしまったのでネットワーク対戦砲撃戦の創りこみを行います。必要な要素は見えているはずなのでただ進めるだけと思います。

一方でシングルプレイヤーモードでの動作に影響が多々出ているでしょうから、ここでの確認と修正作業が必要でしょう。

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

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

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

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

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

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

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

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

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

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

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

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

 

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

ネットワーク対戦モードの動作実現。

最後に

いやあ、時間がかかります。ブラックボックス化アプローチなわけですけど、本質理解が無い上にプログラムのコーディングが高級すぎて本当に自分には難しい状況です。時間がかかりすぎる。牛歩状態にあるということ。

ここ1週間位で、このままネットワークゲーム実現に進むのか、一旦中断して、他のアプリ開発を実施するかを決める必要がありそうな予感です。とにかく時間がかかりすぎるからですね。

以上

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

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

   

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

 

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