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

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について](http://normalanagadfokumento.blogspot.jp/2014/07/photoncloudphotonviewismine.html)

ほぅ…

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

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

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

二時間唸らずに済んだ。

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

```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について](http://normalanagadfokumento.blogspot.jp/2014/07/photoncloudphotonviewismine.html)
#参考書籍
[Unity5オンラインゲーム開発講座 クラウドエンジンによるマルチプレイ＆課金対応ゲームの作り方](http://www.shoeisha.co.jp/book/detail/9784798140735)