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

はじめに

これまでに2年半とかで10作程度iPhone/Androidアプリを創って来ましたが、ネットワークゲームは創ったことはありません。努力をしなかったわけではなくて、結構時間を使って2回のフィージビリティスタディ(FS)を行ったのですが、どうもアプリを構築できるところまでの必要技術獲得ができていなかったからです。

元々今は、最新アプリを出した直後で、少しの間のUnity休みの期間なのですが、次に何を創るかを検討する中で、今回はなんとかネットワークゲーム(UNET)を実現したいかなと思い始めました。

なので、その3回目のFSの最初としてこれまでのFSの反省をしようかと思った訳です。

インディーズな皆さんはするするとネットワークゲームを構築できているのでしょうかね。自分的にはこれまでのFSの結果から、今回のFSでも良い成果が得られるとは思えませんが、まあこの場を借りてFSを記録していこうかと考えております。

これまでのFSで何をやったのか

自分のアプローチの話ですが、新しいプラットフォーム(ネットワークゲームUNETはこれにあたりますが)を自分のものにする(本質的に理解するということ)ためには、書籍を最初のベースとします。理由は簡単でその書籍の中で必ず動作するアプリ(ゲーム)が入っていることです。ただ、ネットワークゲーム関連の書籍は少ないですけれど。

最初のネットワークゲーム書籍

この本です。iPhone/AndroidアプリをUnityで創り始めたころに購入しました。このころはUnityの通常3Dアプリ構築だけで手いっぱいでしたので結果的にはネットワークゲームの情報入手はしましたが、実際に何かプロジェクトを創っては始めていません。

しかし、この中でアプリ内課金としてあるサービスを紹介してくれていて、それはちゃんと戦艦アプリに入れて最終的に登録しようとしたら、そこでようやく気が付いたのです。このサービスは日本語対応のみ。つまり日本以外では使えない。とかで、APP StoreでのIAPへと緊急換装したことを思い出しました。

2番目に購入した書籍

この本で本格的に試験プロジェクトを起こしてみました。これは結構本格的で期待したのですが、結果的にはちょっと難しすぎてどうしても本質理解にまでは到達できませんでした。

この本の中の基本説明の部分とアプリソースコードの間に若干ギャップがあって自分にとっては見通しが悪いのです。しかしやはり最も難しいのはベースとして考えるべき概念が多すぎることがネットワークゲームの難しさなのでしょう。

2017年7月15日からいろいろ始めて2017年9月17日に「UNETうまくいかん!」としてFS放棄しています。同時に実施していたPoserProからキャラクターのUnityへの取り込みがうまくいったので、美人お姉さんキャラゲームのFSにこの日から入ってしまいました。

いちおうこの本のゲームをベースに8人参加規模のネットワークアプリを創り始めました。検討対象はやっぱり戦艦ゲームです。船は動きが遅いですからね。ちょっと問題なのはこの参考書のアプリは結構高速なアクションゲームなのです。なので、本質的にはオーバースペック。ネットワークによる遅延をどうプレイヤーに見せないようにするのかが本質の一つなのですけどね。でもそのために複雑な処理を取り入れています。

アセットストアでのネットワークゲームデモシステム

あれ、このアセットは元はUnityTechnologyじゃないところで創られたものだと思いますが、今みるとUnityに変わっています。ちょっと研究しなければいけません。あれ、ありました。30$のほうが自分が購入したアセットです。完全な形で動作可能なUnityのUnetネットワークゲームが入っています。最大12人同時プレイだったかな。

これすごいのは、自分の創りたいものへ少しずつ変更すれば自分のアプリになることなのです。だけど、このスクリプトはすごくシンプルで短い。だけどUnityの書類というのは全体構成や全体としての動作の意図とかが見えないので全体把握的には自分の性格的にはちょっと大変すぎてやれていません。今度はUnityTechnologyのほうを見てみようと思います。

以下のアセットは1年前にはなかったと思います。なんといってもUnityTechnology純正ですからね。これは良いのかも知れません。ちょっと見るといろいろな背景等もあるようです。

その他はネットからの情報入手

本を見て理解できない部分があるとネットで調べます。いろいろな方の観点で物を見ることが重要です。今回もそうやっていろいろと見たのですがどうもうまく行きませんでした。

そして創ってみたものは何か

簡単な戦艦操作を創ってみた。単独ならそれは動く。ネット経由でmac内アプリとUnityeditorとの2つのクライアントで動作させる。そこでもなんとなく動く。ここで失敗したのは、本質理解していないのに、ネットワーク遅延をごまかすための複雑な遅延補完+予測機能を同時に創りこんだことですね。結果としてなんか動くけどうごかない問題が山ほどあるという状況。何がなんだかさっぱりわからない。もともと脳味噌が弱いのにこれでは先へ進めない。と考えてFSを中断したのでした。

これまでのFSで何が問題だったのかの整理

自分的な問題ですが、まあ大きな組織とかで開発しているときには、この手の問題は誰か先人をつかまえてちっと話をするとすぐに自分の認識のずれがわかってすばやく先へ進めることができます。しかし個人開発だとそうはそうは行きません。ちょっとこれまでの失敗原因を分析して改善できる可能性があるかどうかを調べたいと思います。

登場人物が多すぎる

まあシステム的な複雑度が飛躍的に増えるのであるから難しくなるのは本質的なのでしょう。そしてそのことを示すように下記に示す多くの用語が出てきている。これを正しく理解して適切にコードとして記載する必要があるのですが、元来ええ加減なアプローチしかできない自分としてはなかなか難しいです。なので時間をかけてゆっくりゆっくり進みますか。

・クライアント・サーバー・ホスト

・Network Manager, NetworkIdentity, Spawn,

・isLocalPlayer, isClient, isServer,

・[Command],[Client], [Server],[ClientCakkbacj],[ServerCallback],[SyncVar],[ClientRpc]

・public override void OnStartServer().. OnServerConnect, OnServerAddPlayer..

・NetworkLobbyManager,NetWorkDiscovery,NetWorkManager,NetWorkManagerHUD..

最初でまず死ぬ

まあ本でもネットでもまず例に従ってやるとNetworkManagerの元、通信遅れを考慮しないカクカク動作を創れるのですけど、その時に発生させるプレイヤーオブジェクトを選択可能にできないのです。spawnという処理で実施するのですけど、登録してある1種類のオブジェクト(prefabですが)しか生成できないのです。これを変更可能とするためには結構めんどくさい。本の中では初級説明編の中では記述されていないのですが、アプリとしてはできています。が、これまで全く説明できなかった機能と共に実現されていてとても難しい。アセットではできているが理解できない。ネットではほとんど記載されていなかったです。英語だと幾つかQ&Aがあったのですが前提となる知識レベルがかなり上方にあったので理解できない。でもこれできないと先へ進む気がしない。ということでここで断念したような記憶があります。

ネットでの情報を見つけました

ここまでこの記事を書いていてネットでも少し調べていたらUNETについて否定的な記述がされているサイトを見つけました。見ていてちょっと暗くなってしまいました。対応検討します。

現実と戦うUNET入門(2018-03-15)

ひとつだけ特別気になる記述があります。それはUNETをインターネット経由で使うと(というかそれしか意味ないじゃないですかね)有料だという話。調べると16接続までは無料ということのようです。1つのホストに対しての接続数ならば全く問題ないですし、そうでなくてアプリ種類として制限されていてもまあそれで不足するならば幾らか知らんけどお金を払いますかね。

それでもまずUNETで同期遅延付のカクカクアプリを創って動かす

まあ、この記事を契機にUNET関連の過去の挫折と最新の情報を少し整理しました。結果としてどうするかというと、まずUnityTechnologyのマルチプレイヤータンクを修正しながら創ろうかなと感じています。残念なことですが本は説明用の簡単な部分を詳細に説明して、アプリ創りに重要な部分は表層的で難しい説明だけが並んでいるのです。なのであれば、UnityTechnologyのサンプルプロジェクトでそのまま上位層はブラックボックス化して全体創りこみをするアプローチにしようかなとか感じます。

ということでまずはカクカク戦艦バトルをネットワークゲームとして完成させた後で徐々に本格的に楽しめるアプリに変えて行けたらなというのが今回のこの記事で整理した結論です。かなり難しいとは思いますが3度目のFSを開始します。

ひとつアイデアはあります。戦艦って動き遅いですから、そして操艦の重厚感がなければ面白みを感じませんので、それを前提に全体のつじつまを合わせるアプローチです。つまりネットワーク上は最低限技術と借り物で済ませて、ちまちま努力できる部分で頑張るというアプローチ。まあそんなことを考える今日一日でした。

何か特筆すべき状況が得られたらこの場をかりて報告させて頂きます。

以上

参考ですが、このゲームをネットワークアプリ化したいと考えております。