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

はじめに

前回の結論としてUnity Technologies自身が作成した下記のマルチタンクゲームを使ってフィージビリティスタディ(FS)実施するとなりました。まあワールドカップを見ながらそのFSをちょぼちょぼ進めているという状況です。その状況をここで少しずつ報告させて頂きます。

TANKS! Networking Demo (何といっても無料です)

TANKS! Networking Demo探索

自分の環境について

Unity: Unity 5.6.3p4です。

TANKSNETアセット導入

空のプロジェクトを作成してアセットストアからダウンロードしてインポートします。

Unity Service関連設定

付属のマニュアルに従ってUnityServiceのMultiplayerの設定を行います。ここでわかったのは、無料版だと同時利用ユーザーは20人のようですね。幾つもアプリが起動されていてもトータルで20人なのであろうこともわかりました。ちょっと気になるけどまあ良しとします。

アプリを起動してみる

軌道シーンがセレクトされていないので、SplashScreen.unityシーンをロードしてプレイしてみるといきなり動作しました。これはすごい。1人プレイモード(トレーニング)で遊んでみるとなんかごりごり動いています。

ネット対戦としてみる

ちゃんと動いているようなのでmacでビルドしてmacで動くプログラム(mac-app)を創ります。

このmac-appを先に起動しておいて、次にunity-editorで起動して2つのアプリがネット(家の中のLANですが)でつながっている状態となります。

そこで初めてネットワーク機能を使います。unity-editorの最初のロビー機能のところで”CREATE GAME”で自分で何か名前をつけてネットワークゲームを立ち上げます。mac-appからは”FIND GAME”で探すとちゃんとその名前が検出されます。

そして両方で準備完了の意味の”READY”を押すと対戦が始まります。そしてまあ闘って勝ち負けが決まりボーナスポイントがもらえて終了します。

このように簡単にビルドしたアプリがそのままネット対戦できることが確認できました。

アセットの調査開始

さてさて、それでは自分の手の内にあるTANKSNETアセットの内容の分析を始めます。

まず英語版の簡単なマニュアルがありますが、これを日本語訳しました。最近は英語は本当に楽です。Google翻訳の能力は高すぎます。20P程度でしたけど1時間かからずPDF版を創ることができました。このアセットを変更しながらアプリ作成を目指すという流れの中ではこのマニュアル獲得は非常に大きいと感じます。

そしてプロジェクトの構成を見るのですけれど、そのスクリプトの多さにほとんど泣きそうです。200を軽く超えそうです。ですが、ネットワークマルチプレイだけでなく独りでのシングルプレイも対応可能であり、その上10を超えるステージで3種類の戦車を選択可能で、アプリ内購入(IAP)や広告(UnityADS)の対応までできて、得点の処理やボーナスの処理、レベルの管理やステージの管理等がすべて実現されています。

これが何を意味するかと言えば、まあ自分が今後創れるであろうアプリのすべての要素を完全に含んでいるというように感じました。

なので、基本的な方向性として、このアプリの中で出来上がっているインフラ機能はそのまま使わせてもらいながら、ステージやバトル内容に特化したシーンのみ自作するという開発戦略を取りたいと考えました。

なお、次に示すマニュアル内のネットワーク関連機能のアーキテクチャが重要そうなのでその和訳部分を示させて頂きます。

マニュアル内の第3章:アーキテクチャの部分の抜粋

セクション3 – アーキテクチャ
Tanks !!!の場合、カスタムNetworkManagerは組み込みのUnity NetworkManager拡張し、私たちのニーズに固有の機能を組み込みます。シングルプレイヤーは、コアのゲームロ
ジックの再構築を最小限に抑えるためにローカルホストの直接ゲームとして扱われます。
ゲームのメインメニューはパネルで構成され、各パネルにはその画面の機能を制御するク
ラスがあります。

すべてのパネルは、遷移を制御するMainMenuUIオブジェクトで参照されます
異なる画面間でそれぞれの画面に表示されるレベルとモードは、ScriptableObjectsに格納さ
れます。ScriptableObjectsはデータコンテナです。MonoBehavioursに似ていますが、
GameObjectには添付されていない点が異なります。また、ProjectでAssetsとして保存する
こともできます(詳細については、ScriptableObjectのチュートリアルを参照してくださ
い)。
たとえば、MapDetailsは、名前、説明(シンプルなフレーバーテキスト)、シーン名、プ
レビューイメージなど、シリアライズ可能なフィールドを持つマルチプレイヤーマップを
表すシリアライズ可能なクラスです。多くのマップがあり、それぞれにMapDetailsインス
タンスがあります。MapListという別のクラスには、これらのMapDetailsインスタンスのリ
ストが含まれています。MapListはSerializedObjectから派生しているため、シリアル化する
ことができます。
既存のシーンをマルチプレイヤーマップとして追加するには、マップリストにエントリと
して追加するだけです。新しいマルチプレーヤーマップを作成するには、既存のマップを
複製してテンプレートとして使用するのが最も簡単です。ScriptableObjectを使用すること
の大事な点は、GameObjectやPrefabにアタッチする必要がなく、別の設定レイヤーとして
保持できることです。これにより、Prefabを危険にさらすことなく、開発チームの技術者
以外のメンバーが構成にアクセスできるようになります。私たちのケースでは、コピーエ
ディタが設定にアクセスできるようにして、特定のスタイルに合わせて名前やフレーバテ
キストを調整できるようにしました。
ゲームプレイは、GameSetクラスからゲームプレイ設定を受け取るGameManagerクラスに
よって管理されます。このプロセスについては、第4章「ゲームの管理」で詳しく説明して
います。

このアセットのスクリプトの記述方法について

いよいよスクリプト探索です。どの機能をどのスクリプトでどう記述しているかを探索するのです。これが見えてこないと必要な部分の修正作業ができません。

当然ながらこのスクリプト(C#)はプロフェッショナルが記述していてすばらしいコードなのでしょう。C#の重要なまたは便利な機能が多々使われています。

一方、自分のプログラムレベルは最低ですので、C#なのだけど、こころではBASICだと思ってコード書いていますからね。その観点でプロのコードを見るとまるで理解できないことが多々あります。

このアセットのスクリプトは困ったことに(たぶんプロフェッショナルだからでしょうが)、①多数のスクリプトに分割記述されている。②コードが洗練されている。③C#の便利な機能が多々使われている。という自分にとっては3つの不得意なポイントがあります。

ただ幸いなことに、スクリプト自体は短縮された形で書かれているのではなく、まあそこそこ読みやすい形で書かれていました。なので、自分で改造が必要な機能がどのスクリプトにあるのかを見つけること、およびその修正を考えることが、なんとか可能かなと感じ始めています。かなり時間がかかるかも知れませんが、ネットアプリに必要なすべての機能を含んでいることを考えるとじっくりとのこのアセットのスクリプトを調べようかと思います。

重要な点はすべてのスクリプトを知っている必要は全くなくて、ある一部分のインターフェースさえ押さえれば後は自由にやれるということです。

そしてちょっと修正してみました

時間が撮れていないのでまだあまりできていませんが、何度もここで紹介させて頂いている下記の軍艦アセットを使ってちょっと創ってみました。

戦艦大和プレファブを創ってメニュー画面に組み込んで準備してプレイしてみると、まあちゃんと大和が砂漠の中を動いてゲームが始まりました。大砲の弾も飛んでいるのがちょっと見えます。

少し先まで大和は進んで大砲撃って攻撃しています。

まあここまで動かせましたので、シーンの創り方や操作やカメラ等々を調べながらネットワーク対応をしていくことになるのでしょう。重要なことは動かしながら少しずつ自分の創りたい方向へ進めることだという理解です。

マニュアルにもありましたが、シングルプレイの場合の敵の動きもネットワーク経由の他プレイヤーと同じように見せたりするのでしょうから、良くTANKSNETの仕組みを理解しながら進めたいと考えます。

最後に

ちょっと時間が取れてなくて進んでいませんが、また進んだらここで報告させて頂きます。

参考:最終的には下記アプリをネットワーク対応したいと考えています。

  

以上