
マイケル
どうもみなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
クマ〜〜〜

マイケル
今日はこれまで作っていた3Dゲームに
ネットワーク機能をつけてマルチプレイできるようにしようとしていたのですが・・・
ネットワーク機能をつけてマルチプレイできるようにしようとしていたのですが・・・
※過去記事はこちら!
【Unity】オンライン3Dアクションゲームの作り方をまとめる! (前編)
Unityゲーム開発 オンライン3Dアクションゲームの作り方

マイケル
参考にして進めていた書籍の情報が古すぎて全く使えませんでした・・・

エレキベア
2014年に書かれた本だから仕方ないクマ・・・

マイケル
そんなわけで現在はどのように実装するのがいいのか調べてみたところ、
PhotonUnityNetworking(以下、PUN)というサービスを使うのがよさそうだということが分かりました!
今回はPUNの導入とルーム管理機能について調べてまとめます!
PhotonUnityNetworking(以下、PUN)というサービスを使うのがよさそうだということが分かりました!
今回はPUNの導入とルーム管理機能について調べてまとめます!

エレキベア
PUNって何なんクマ?

マイケル
いい質問だね!
それじゃまずはPUNの概要についてみていこう!
それじゃまずはPUNの概要についてみていこう!
PUNとは

マイケル
まずはPUNとは何か、なぜ選んだかについて!
〜PUNとは〜
Photon Unity Networking の略で、
マスターサーバやルーム管理などマルチプレイ実装に必要な機能を
提供してくれるUnityパッケージである。
・・・ Photon公式サイトはこちら

エレキベア
これを使うとマルチプレイ機能が簡単に実装できるというわけクマね

マイケル
そういうことさ!
こういったサービスを使わなかったら、サーバの準備などハード面の問題やNATパンチスルーなど通信問題等、考慮して組み込まないといけないんだけどその辺の面倒くさい機能を一律提供してくれるんだ!
こういったサービスを使わなかったら、サーバの準備などハード面の問題やNATパンチスルーなど通信問題等、考慮して組み込まないといけないんだけどその辺の面倒くさい機能を一律提供してくれるんだ!

マイケル
ただ、20人までの接続は無料だけど、それ以上は有料プランになってしまうので注意です

エレキベア
すごいクマ〜〜〜!
PUNの他にも色々あるクマか??
PUNの他にも色々あるクマか??

マイケル
まずUnityに標準で組み込まれているUNetというのがあったんだけど、これはUnity2019で廃止されたみたいだ。
Photonと同じようなサービスとしては他にMUN、GameLift、Strix Unity SDKというのもあるみたいだよ!
Photonと同じようなサービスとしては他にMUN、GameLift、Strix Unity SDKというのもあるみたいだよ!

マイケル
今回はその中でも導入例が多くて機能数も多いPUNを使用したというわけさ!

エレキベア
そんなにたくさんあるクマか
導入方法

マイケル
導入方法は以下の手順になります!
1. Photon公式サイトでアカウント登録をし、アプリIDを取得する。
Photon公式サイト
2. AssetStoreから「PUN2」をインポートする。
3. Window > Photon Unity Networking > PUN Wizard > SetUp ProjectでアプリIDを設定する。
※再起動しないとメニューに出てこない場合があります。
4. Assets/Photon/PhotonNetworking/Resources配下にあるPhotonServerSettingsの「Fixed Region」に「jp」と入力する。

マイケル
以上で導入は完了です!

エレキベア
かんたん4ステップクマ
実装方法について

マイケル
それでは実装に移っていきます

マイケル
まず、Photonのルーム管理までの流れは下記の図のようになります!

エレキベア
Photonサーバの中でロビーやルームを管理してくれてるクマね

マイケル
このイラストの矢印部分の
1. Photonサーバ接続・切断
2. ロビー入退室
3. ルーム作成・入退室
に沿って実装方法を見ていくよ!
1. Photonサーバ接続・切断
2. ロビー入退室
3. ルーム作成・入退室
に沿って実装方法を見ていくよ!
Photonサーバ接続・切断

マイケル
Photonサーバへの接続はConnectUsingSettingメソッド、
切断時はPhotonNetwork.Disconnectメソッドを使用します。
切断時はPhotonNetwork.Disconnectメソッドを使用します。
使用するとコールバックで
OnConnectedToMasterメソッド(接続完了時)
OnDisconnectedメソッド(失敗時)
が呼び出されるので接続結果に対しての処理はこちらに記述しましょう!

マイケル
コールバック関数を定義するため、継承クラスはMonoBehaviourPunCallbacksに変更するのも忘れずに行って下さい

エレキベア
さっき設定したPhotonServerSettingsを使って接続するクマね

マイケル
飲み込みが早いですね

マイケル
また、オフラインで接続したい場合には、PhotonNetwork.OfflineModeをtrueに設定します。
その場合、trueにした時点でコールバック処理が呼び出されるため注意しましょう!
その場合、trueにした時点でコールバック処理が呼び出されるため注意しましょう!

エレキベア
数行かけば済むから簡単クマね〜〜
ロビー入退室

マイケル
ロビーへの入室はJoinLobbyメソッド を使用します!
こちらも同じく入室完了後にコールバックとしてOnJoinedLobbyメソッド が呼び出されます。

エレキベア
Photonサーバ接続と同じような感じクマね

マイケル
また、ロビー入室時に上記OnRoomListUpdateメソッド が呼び出されて
ロビー内のルーム一覧が取得できるのですが、これが中々曲者で・・・
ロビー内のルーム一覧が取得できるのですが、これが中々曲者で・・・

マイケル
コールバックされるタイミングは
・ロビー入室時
・他のプレイヤーがルームを更新した時
だけで、ルーム更新時には更新したルームリストしか引数で渡されてこないんです。
・ロビー入室時
・他のプレイヤーがルームを更新した時
だけで、ルーム更新時には更新したルームリストしか引数で渡されてこないんです。

マイケル
そのため上記のように渡されてきたルームが削除かどうかを調べて表示するリストを更新しなければならないようです。

マイケル
その他にも自動入室するAuto-Join Lobyや、ルーム一覧を取得するgetRoomListなんて機能もあったらしいですが、どうやらPUN2で廃止されたらしく、自分で実装するしかなさそうです・・・
リンク先(参考):https://doc.photonengine.com/en-us/pun/v2/getting-started/migration-notes

エレキベア
カナシマシマシクマ・・・・
ルーム作成・入退室

マイケル
ルームの作成はCreateRoomメソッド 、
ルームの入室はJoinRoomメソッド を使用します。
ルームの入室はJoinRoomメソッド を使用します。
こちらも他のメソッド と同じくコールバックとして
OnCreatedRoomメソッド (ルーム作成完了時)
OnCreateRoomFailedメソッド (ルーム作成失敗時)
OnJoinedRoomメソッド (ルーム入室時)
がそれぞれよばれます!

マイケル
ただ一点注意なのは、ルームの作成時には自動で入室処理が行われるということです。
まあルームにはホストが必要なので当たり前といえばそうですが・・・
まあルームにはホストが必要なので当たり前といえばそうですが・・・

エレキベア
これでルーム入室まで出来たクマね

マイケル
とりあえずここまでの機能で接続は試せそうだね。
早速これらを使って接続を試していこう!
早速これらを使って接続を試していこう!
接続テストプログラムの作成

マイケル
接続やメソッド呼び出しを確認するため、テスト用の画面を作りました!
作った画面は下記になります。
作った画面は下記になります。

マイケル
モード選択でONLINEModeを選ぶとPhotonサーバと接続すると・・・

マイケル
ルーム作成とロビーにあるルーム一覧が表示される!
確認する機能だけに絞った画面になります
確認する機能だけに絞った画面になります

マイケル
下記にGUI表示も含めたソースは全部下に貼っておくので、
少し長いですが必要に応じて参考にしてください!
少し長いですが必要に応じて参考にしてください!
接続テスト結果

マイケル
それじゃ作ったテストプログラムで接続を確認していくよ!

エレキベア
楽しみクマね〜〜

マイケル
ネットワークテストで実行アプリが2つ以上必要だから、
ビルドして書き出したAPPとUnityシミュレータでの操作とビルドファイルでの操作が同期されていることを確認します!
ビルドして書き出したAPPとUnityシミュレータでの操作とビルドファイルでの操作が同期されていることを確認します!

マイケル
まずUnityシミュレータ側でルームを作成して、、

マイケル
ビルドしたAPPで接続するとUnityシミュレータ側で作ったルームが無事に一覧に表示されています!
どうやらうまく同期できたみたいです!
どうやらうまく同期できたみたいです!

エレキベア
おめでとうクマ〜〜〜!!

マイケル
ここまで確認出来ればあとはマルチプレイ機能をガンガン実装していくだけだ!

エレキベア
大きな一歩を踏み出せたクマね
まとめ

マイケル
というわけで今回はPhotonを使用したルーム作成の確認でした!

マイケル
ネット上も古い情報が多すぎて
これだけ調べるのでも丸一日かかってつかれたぜ・・・
これだけ調べるのでも丸一日かかってつかれたぜ・・・

エレキベア
おつかれさまクマ・・・

エレキベア
でも同期できた時は楽しかったクマね〜〜

マイケル
そうだね!
これからゲームに組み込んでいくのが楽しみだ!
これからゲームに組み込んでいくのが楽しみだ!

エレキベア
一緒にがんばっていくクマ〜〜〜!

マイケル
心強いぜエレキベア!
それじゃ今回はこの辺で!アデュー!
それじゃ今回はこの辺で!アデュー!

エレキベア
クマ〜〜〜
【PUN2】ネットワーク管理にPhotonを使ってみる 〜導入からルーム・ロビー管理まで〜 〜完〜