現実と戦うUNET入門

概要

諸事情でUnityのUNETを使わざるを得なくなった人に対するラーニングパスの提案です。

最初に

それUNETじゃないとダメですか?Photonありますよ?Monobitありますよ?また、リアルタイム性が不要だったらNiftyクラウドあります。 あとソシャゲ的な作りの場合はUNETあんまり使わないですよ。LANじゃないインターネット経由のマッチメイキングはUNETも有料ですよ?

UNETのリリース時に謳われたアップデートが遅々として進まないのは、もしかしたらUNETはUnity的に見捨てられてて、ある日突然deprecatedになるかもしれませんよ。

https://forum.unity.com/threads/unity-hello-is-there-anybody-out-there-p.445978/

また、十分な開発期間が取れるならLLAPIやUDPを元にHLAPI相当を自作するとかも検討に入るかもしれませんよ。

…はい、やりましょう。これも人生です。

UNETがあんまり好きじゃない理由

  • ドキュメントの未整備
  • 様々なバグがドキュメントに記載ないまま 「仕様です」のまま放置されている 例: https://forum.unity.com/threads/onstartclient-called-before-scene-is-fully-loaded.427952/
  • ホストマイグレーション未対応
  • 実践的なサンプルの少なさ
  • 出来る人の多くがPhotonに移行してしまうので、初心者向け資料ばかりある(この記事も初心者向けです。なぜなら僕が初心者なので)
  • 標準のNetworkTransformと標準のNetworkAnimatorすら使い物にならないので自作することになる。
  • SyncListを多用するとランダムにパケットロスする

この辺の話を聞いても、まだやりますか… 一応こういうまとめも訳しています。

UNET Unofficial Documentation (Errors, Workarounds, Best Practices)
https://qiita.com/neon-izm/items/8b98d8fbf590b31c72ef

具体的なラーニングパス

最初に 凹みさんの詳説を全部読む。

tips.hecomi.com

1. ひよこのたまごさんのUNET解説記事を全部読んで順番に試す。 http://hiyotama.hatenablog.com/entry/2015/07/06/153000
ステップバイステップの記事として一番情報量が多い日本語記事です。

2. Tank! Networking Demo.を穴が空くほど突つく。 Tank! Networking Demoは、2018年現在において、 まともな 資料があるUNETを使ったネットワークゲームっぽい作りの無料サンプルとしてほぼ唯一です。絶対におすすめです。 アセットストア https://assetstore.unity.com/packages/essentials/tutorial-projects/tanks-networking-demo-46213

解説動画 https://unity3d.com/jp/learn/tutorials/s/tanks-tutorial

Unityフォーラムスレッド https://forum.unity.com/threads/multiplayer-networked-tanks-demo-q-a.356443/ あと、このサンプルはPhoton版もあるので逃げたくなった時の移植も参考に出来ます(ボソッ)

それ以降
もっと凝った物ということで Tank! Reference Project  も2.と同じような感じですがキャラクター選択などの現実的な追加実装が入っています。また戦車かよ!という気もしなくもないですが…

https://assetstore.unity.com/packages/essentials/tutorial-projects/tanks-reference-project-80165

その他メモ(数か月前の自分に向けたメッセージ)

使う技術の取捨選択はこんな感じ f:id:izm_11:20180305154916p:plain

  • NetworkManager,NetworkdDiscoveryはまともにゲーム作るなら99%の確率で継承した自前版を作ることになる。
  • NetworkManagerを使った純粋なサーバークライアントモデルの資料は少ないのでホストクライアントモデルで作った方がマシ
  • Rpcで呼ばないと各端末のオブジェクトが同期しない。(逆に言うと、同期しなくても良い物はRpcを避けた方がネットワークに優しい)
  • 極論すればNetworkTransformやNetworkAnimatorもRpcの糖衣でしかない
  • 随時ジョイン可能なゲームにすると考えることが一気に増えるのでロビー→締め切り→ゲーム開始 型にした方が良い
  • そもそもネットワークゲームを初めて作る時にUNETを選ぶのは悪手。自分のネットワークの理解が足りないのか、自分のUNETの理解が足りないのか、UNET固有のバグかを絞り込めなくて死ぬ。MonobitかPhotonで始めましょう。
  • UNETのAndroidとUnityエディタの通信は、ウィンドウズのファイアウォール切って試すと通信成功したので、横着するならこれで良い気はしました。

以下随時思いついたら追記

https://forum.unity.com/threads/my-compiled-list-of-unet-bugs-issues.403578/

www.raywenderlich.com

UNET使ったカードゲームサンプル assetstore.unity.com