UNETを捨ててPhotonを使おうと思った理由

# はじめに
わりと単純なネットワークゲームをモバイル向けに作ろうとして「Unity公式だしUNET使っとけばいいっしょ」と思っていろいろ実装してたらある理由でぶん投げることになった。手をつける前にもっと調べとけばよかった。

同じ思いをする人が少しでも減ることを祈った記事。

# TL;DR
マッチメーカーだと<font color="red">ホストマイグレーションが使えない</font>。これに尽きる。これが使えると思ったからUNETでいいと思ったのに。

WindowsとMacとLinux向けであれば[アセット](https://www.assetstore.unity3d.com/en/#!/content/58948)買えばAPIほぼそのままでなんとかなるみたいなので買うといいかもしれません。

## <font color="red">2017/5/10 追記</font>
* Unite Tokyo 2017でUnityの中の人に聞こうと思ったけどUNET詳しい人がいなかった
* [Photon Thunder](https://www.photonengine.com/ja/Thunder)とかいうのがUNET互換らしいけどまだプレビュー版
  * Unite Tokyo 2017で聞いたけど一般公開がいつになるか不明
* モノビットも[Monobit Unity Networking 2.0（MUN）](http://www.monobitengine.com/mun/)で2017年夏にUNETのインターフェース対応予定

# ホストマイグレーションとは
[ホスト・マイグレーション](https://docs.unity3d.com/ja/current/Manual/UNetHostMigration.html)（公式のマニュアル）

>
「ホスト・マイグレーション」機能を使用すると、リモートクライアントのひとつを新しいホストにすることができるので、マルチプレイヤーゲームを継続させることが可能になります。

「あら素敵。スマホのネットワークゲー作ってもサーバ持たなくていいじゃない！」と思ってました。

# ホストマイグレーションには制限があった
[ホスト・マイグレーション](https://docs.unity3d.com/ja/current/Manual/UNetHostMigration.html)（公式のマニュアル）の最後にある文。
>
### 制約
>
サーバー（ホスト）のみに存在していたデータは、ホストの接続が切れると失われます。ホスト・マイグレーションが正常に実行されるためには、重要なデータを（サーバー上だけに保管するのではなく）クライアントに配信する必要があります。
>
上記は、ゲームが直接接続を使用している場合に当てはまる説明です。マッチメーカーやリレーサーバーを使用している場合には、追加の作業が必要となります。

このときは「まじかー。めんどくさそうだわ〜」くらいのノリ。

# Unity公式のやるやる詐欺
[UNet host migration with matchmaker / relay server planned in future?](https://forum.unity3d.com/threads/unet-host-migration-with-matchmaker-relay-server-planned-in-future.382666/)

上記のフォーラムでのやりとりを見るに

---

Unityの中の人「いつとは言えないけど早い段階でリレーサーバでもホストマイグレーションのサポートするよ」（2016/4/15）
↓
一年後の今まで音沙汰なし、ロードマップに記載なし

---

でみんな激おこぷんぷんでPhotonに移行してる感じ。

[NAT Traversal](https://www.assetstore.unity3d.com/en/#!/content/58948) という6,000円くらいのアセットを買えばUNETのAPIほぼそのままでホストマイグレーションできそうだったけど対応プラットフォームが「Windows, OSX, and Linux」とのことでモバイルは「まぁ将来的には」くらい。WebGLは無理だそうです。

以下 [アセットのFAQ](http://grabblesgame.com/nat-traversal/faq) より抜粋
>
### Will this work for mobile platforms (iOS and Android)? If not, is this planned?
>
No. Yes. Mobile support is the next feature we want to add but we can't give a timeline on when it will be implemented. Sorry.
>
### What about web builds / WebSockets
>
The library we use for puchthrough (RakNet) does not support WebSockets. So...that's a no. There are no plans to add WebSocket support at this time, but that may change once the mobile stuff is done.

# 参考資料
* [Unity 2017b1 のホストマイグレーションのマニュアルページ](https://docs.unity3d.com/2017.1/Documentation/Manual/UNetHostMigration.html)

>
### Constraints
>
Data that is only present on the server (the host) will be lost when the host is disconnected. For games to be able to perform host migration correctly, important data must be distributed to the clients, not held secretly on the server.
>
This works for direct connection games. Additional work is required for this to function with the matchmaker and relay server.

内容に変化なしで直接接続のみに対応とのこと。

* [6 months later, this is why we're migrating from UNET to Photon](https://www.reddit.com/r/gamedev/comments/5l26if/6_months_later_this_is_why_were_migrating_from/)
  * あまり読んでないけど「80% useful info, 20% rage」で構成された内容。
  * 「そもそもホストマイグレーションがウリの機能だったのに急に『直接接続のみの機能です』ってなんだよ」というところと「UNETは捨てられた説」だけ読んだ。うん。。。

* [How to handle host migration for UNET MatchMaker in the lobby?](https://forum.unity3d.com/threads/how-to-handle-host-migration-for-unet-matchmaker-in-the-lobby.445309/)

  * [NAT Traversal](https://www.assetstore.unity3d.com/en/#!/content/58948) の作者曰く「 [NetworkTransport.ConnectAsNetworkHost()](https://docs.unity3d.com/ScriptReference/Networking.NetworkTransport.ConnectAsNetworkHost.html) がバグってるんじゃないか」とのこと。

* [Photon vs uNet](https://www.reddit.com/r/Unity3D/comments/5ge74q/photon_vs_unet/)
  * あとで読む

* [【Unity】NetworkMigrationManagerを試してみる【UNET】](http://chroske.hatenablog.com/entry/2016/07/15/151844)
  * 直接接続時の使い方
* [Unite 2017 Tokyo 講演タイムテーブル](http://events.unity3d.jp/unite2017tokyo/session-
lineup.html)
  * 明後日のUnite 2017 Tokyoの公演内容。Uniteで触れられなければもう死んだと思ったほうがいい気がする。