UnityでPhoton Realtimeを触り始めたのだが、書籍のサンプルがどうにも動かずハマったのでメモ。
概要
いわゆるオンライン対戦ゲームのサンプルで、PhotonView.isMine
が必ずfalse
を返してくるという問題に遭遇。PhotonView.isMine
は実行中のPhotonView
が自分かどうかの判定に使う。
Photon経由でのオンライン同期処理はできているはずなのにisMine
が一向にtrue
を返すことがない。PhotonView実行してるの私だ。
ググってみた結果
「photonview.ismine not working」的なキーワードでググるとそれらしいやりとりは出てくるのだが、どうにも解決に至る対応が見つからない。
ドキュメントを見ても情報が増えなかったため純粋に「photonview.ismine」で情報を漁り始めたところ、ピンポイントな記事にたどり着いた。
PUNを使っているとこういうコードに出くわす。(シンタックスハイライトしなきゃ。でもめんどくさい)
test.csclass test : Photon.Monobehaviour { void test() { if(photonView.isMine) { "なんかのコード " } } }
で、 "なんかのコード"部分が実行されない時がある。
それはPhotonNetwork.ConnectUsingSettings("貴方のアプリの適当なバージョン")をあらかじめ呼ばなかった場合である。photonView.isMineがfalseを返しているのだ。
自分はオフライン環境でもコードを使えるようにしていたのだが、一向に”なんかのコード”部分が実行されず二時間ぐらい唸っていた。
ほぅ…
ConnectUsingSettings()の引数にバージョン番号を入れる
読んでいた書籍では説明が省かれていたが、ドキュメントやPhotonのソースを確認したところPhotonNetwork.ConnectUsingSettings()
の引数にはクライアントのバージョン番号を入れる必要があることがわかった。
書籍ではPhoton Realtimeのサーバーへ接続する際にPhotonNetwork.ConnectUsingSettings(null);
という感じで、引数にnullを指定していたので(ConnectUsingSettings()
を呼んでいなかったわけではない)特に意識せず写経していた。
動いた
で、試しに適当なバージョン番号を入れて動かしてみる
PhotonNetwork.ConnectUsingSettings("v1.0.0");
この状態で実行すると、何事もなかったかのようにisMine
がtrue
を返してくれた。
二時間唸らずに済んだ。
ソースを少しだけ追ってみた
ConnectUsingSettingsの引数がnull
だと何でisMine
がfalse
返すのかよくわからなかったので、少しだけ関連コードを追ってみた。
public static bool ConnectUsingSettings(string gameVersion)
{
if (networkingPeer.PeerState != PeerStateValue.Disconnected)
{
Debug.LogWarning("ConnectUsingSettings() failed. Can only connect while in state 'Disconnected'. Current state: " + networkingPeer.PeerState);
return false;
}
if (PhotonServerSettings == null)
{
Debug.LogError("Can't connect: Loading settings failed. ServerSettings asset must be in any 'Resources' folder as: " + serverSettingsAssetFile);
return false;
}
if (PhotonServerSettings.HostType == ServerSettings.HostingOption.NotSet)
{
Debug.LogError("You did not select a Hosting Type in your PhotonServerSettings. Please set it up or don't use ConnectUsingSettings().");
return false;
}
SwitchToProtocol(PhotonServerSettings.Protocol);
networkingPeer.SetApp(PhotonServerSettings.AppID, gameVersion);
NetworkingPeer.SetApp()
でgameVersion
を渡しているようだ。
public void SetApp(string appId, string gameVersion)
{
this.mAppId = appId.Trim();
if (!string.IsNullOrEmpty(gameVersion))
{
PhotonNetwork.gameVersion = gameVersion.Trim();
}
}
どうやらConnectUsingSettings()
の引数がnull
だと、PhotonNetwork.gameVersion
がセットされない模様。
gameVersion
はConnect〜系の引数で使われることが多いみたいなので、指定しないと色々な情報が抜けそうな予感。あとは任せた(早
ちなみにisMineのソースはこんな感じだった。
public bool isMine
{
get
{
return (this.ownerId == PhotonNetwork.player.ID) || (!this.isOwnerActive && PhotonNetwork.isMasterClient);
}
}
とりあえずバージョン番号を入れない理由はないので入れましょう。
参考サイト
凡人の活動記録: PhotonCloud photonView.isMineについて