LoginSignup
8
7

More than 5 years have passed since last update.

Photon Unity Networking(PUN)のPhotonView.isMineがfalseしか返さない件

Last updated at Posted at 2016-05-19

UnityでPhoton Realtimeを触り始めたのだが、書籍のサンプルがどうにも動かずハマったのでメモ。

概要

いわゆるオンライン対戦ゲームのサンプルで、PhotonView.isMineが必ずfalseを返してくるという問題に遭遇。PhotonView.isMineは実行中のPhotonViewが自分かどうかの判定に使う。

Photon経由でのオンライン同期処理はできているはずなのにisMineが一向にtrueを返すことがない。PhotonView実行してるの私だ。

ググってみた結果

「photonview.ismine not working」的なキーワードでググるとそれらしいやりとりは出てくるのだが、どうにも解決に至る対応が見つからない。

ドキュメントを見ても情報が増えなかったため純粋に「photonview.ismine」で情報を漁り始めたところ、ピンポイントな記事にたどり着いた。

PUNを使っているとこういうコードに出くわす。(シンタックスハイライトしなきゃ。でもめんどくさい)

test.cs
class test : Photon.Monobehaviour
{
        void test()
        {
             if(photonView.isMine)
             {
                 "なんかのコード "
             } 
        }
}

で、 "なんかのコード"部分が実行されない時がある。

それはPhotonNetwork.ConnectUsingSettings("貴方のアプリの適当なバージョン")をあらかじめ呼ばなかった場合である。photonView.isMineがfalseを返しているのだ。

自分はオフライン環境でもコードを使えるようにしていたのだが、一向に”なんかのコード”部分が実行されず二時間ぐらい唸っていた。

凡人の活動記録: PhotonCloud photonView.isMineについて

ほぅ…

ConnectUsingSettings()の引数にバージョン番号を入れる

読んでいた書籍では説明が省かれていたが、ドキュメントやPhotonのソースを確認したところPhotonNetwork.ConnectUsingSettings()の引数にはクライアントのバージョン番号を入れる必要があることがわかった。

書籍ではPhoton Realtimeのサーバーへ接続する際にPhotonNetwork.ConnectUsingSettings(null);という感じで、引数にnullを指定していたので(ConnectUsingSettings()を呼んでいなかったわけではない)特に意識せず写経していた。

動いた

で、試しに適当なバージョン番号を入れて動かしてみる
PhotonNetwork.ConnectUsingSettings("v1.0.0");
この状態で実行すると、何事もなかったかのようにisMinetrueを返してくれた。

二時間唸らずに済んだ。

ソースを少しだけ追ってみた

ConnectUsingSettingsの引数がnullだと何でisMinefalse返すのかよくわからなかったので、少しだけ関連コードを追ってみた。

PhotonNetwork.cs
    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を渡しているようだ。

NetworkingPeer.cs
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のソースはこんな感じだった。

NetworkingPeer.cs
public bool isMine
    {
        get
        {
            return (this.ownerId == PhotonNetwork.player.ID) || (!this.isOwnerActive && PhotonNetwork.isMasterClient);
        }
    }

とりあえずバージョン番号を入れない理由はないので入れましょう。

参考サイト

凡人の活動記録: PhotonCloud photonView.isMineについて

参考書籍

Unity5オンラインゲーム開発講座 クラウドエンジンによるマルチプレイ&課金対応ゲームの作り方

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7