概要
Unityでマルチプレイゲームを作るときに真っ先に選択肢に上がるPhoton。それのUnity用のSDKがPhotonUnityNetworking(以下PUN)なのですが、PUNは結構昔からあるPUNと、2018年頃にリリースされたPUN2の2つがあります。で、いざPhotonを使おうと「Unity Photon」とかで検索すると出てくる記事の殆どはPUNの方の記事で、「PUN2」で調べても日本語記事は数えられるくらいしかヒットしません。仕事でPUNを1年半触ってからPUN2を半年弱触ってみて、これもうPUN使うメリットないな?ってなったので、PUN2を使おうぜっていうお話です。
そもそもPhotonってなんぞ???
一応
超簡単に言うとゲーム用リアルタイム通信SaaSです。一重にPhotonといってもRealTimeやBolt、ChatやVoiceなど色々細分化はされてます。それらが統合されUnity用に提供されているSDKがPUN。
バックエンドを意識しないで実装でき、課金も同時接続の上限に比例するだけと個人開発者でも使いやすいのがUnityでマルチプレイ作る時に真っ先に挙げられる理由かなと。あと個人的には標準でUDPで通信できて、通信間のフレームの座標の補完をかけてくれるのがポイント高いです。こいつらの実装は重すぎるので......
#ここが凄いよPUN2
PUNと比較してかなり強化されています
- APIがだいぶイケイケになった
- Instantiateのカスタマイズが可能になった
- コネクションが強化された
順番に説明します。
1.APIがイケイケになった
正直PUNがイケてなさすぎたっていうのはある。触ったことある人ならわかると思うんですがメンバの命名規則が完全にMS標準から外れてたり、コールバック系が動的な処理っぽいとこがあったりで、なんというか「C#ぽくない」ライブラリだったんですよねPUN。それがだいぶC#ぽくなりました。命名規則がかなり一般的なものになり、コールバックも殆どがInterface経由の呼び出しになってパフォーマンスがマシになってる、らしい。
2.Instantiateのカスタマイズが可能になった
PUN使ったことない人に説明しますと、PUNではPrefabをPhotonNetworking.Instantiateメソッド(以下Instantiate)で生成することで、他のプレイヤーとのオブジェクトの同期を取ります。ただPUNの場合このメソッドが曲者で、生成するPrefabはResourcesから読み込む以外の指定方法がありません。あのResourcesです、Unity公式にDon't use it.って言われてるあのResources。一応すげー頑張れば別のところから読み込むことも不可能ではないっぽいのですが、一回やって失敗して諦めました。
ところがぎっちょんPUN2では、IPunPrefabPool実装クラスを設定することによってInstantiate内部のPrefab読み込み方法を簡単にカスタマイズすることができるようになりました。例えばSerializeFieldで参照しているGameObjectや、ちょっと頑張ればAssetBundle内のPrefabも指定できます。そのためパフォーマンス面やアセット管理面がPUNに比べて劇的に改善してます。
3.コネクションが強化された
これが一番大きいです。PUNでは、アプリケーションのフォーカスが少しの間(体感は1秒ちょっと)外れるとコネクションが切れ切断扱いになります。このフォーカスが外れるというのはスマホアプリだと頻繁に発生し、例えば「バッテリーが残りn%です」ダイアログが出るだけで起きます。つまりスマホアプリでPUNを使う場合、特にリアルタイム性が強いゲームでは復帰処理はほぼ必須でした。(ちなみにPUNの再接続機能は「コネクションの再接続ができる」ってだけなので、ゲームに復帰するならデータの復元等は自前で実装する必要があります)
がしかし、PUN2ではこのコネクションが強化されてます。具体的に言うと体感5秒ちょっとはフォーカスが外れても切れません。ここまでくると意図的にアプリを最小化したり本体をスリープさせたりしないと起こらないので、仕様的に切断扱いにしてゲームから弾けばいい範疇です。ただ、どうして&どうやって強化されたのかはわかりません......公式には書かれてない(そもそもPhotonはそんなにDoc充実してない)し流石にSocket通信周りの実装読むのはしんどいので......知ってる人いたら教えてほしいです.......
ここがデメリットだよPUN2
流石に美味い話だけではありません。概要で書いたようにインターネットの大海に落ちているPhotonの記事は殆どがPUNのもので、つまり落ちてるサンプルコードもPUNのものです。前述のようにPUN2では命名周りやコールバックの仕組みが変わってるので、サンプルコードをコピペしただけではコンパイルがまず通りません。通ってもコールバックが取れてなかったりします。ただ逆に言うとPUNではなくPUN2を使うデメリットはこれだけです。
まとめ
今からUnityでマルチプレイゲーム作るなら、コーディングに自信がなくてサンプルコードの改変すら不安ってわけじゃないならPUN2を使うことをお勧めします。また、コード面での変更と対応をまとめてくださってる方やPUNからの移行方法をまとめてくださってる方もいらっしゃるのでこの辺を見ればコーディング自信なくてもそんなに困ることもないんじゃないかなーって思います。
ただそもそも、ある程度以上の規模の開発でPhotonを使うのは結構しんどいです。仕事でも1000行強のラッパークラスで色々機能足して使ってます。最近だと流行りのFall GuysがUnity+MultiPlayで実装されてるみたいですしそっちに挑戦してみるのもいいんじゃないんでしょうか。(よく読んだらそんなことどこにも書いてなかった)無責任発言で締めます、おわり。