Photon Server SDKを使ったオンプレミスサーバでPhotonを接続 （オフライン同期処理可)

## 目的
　まず、Photonとはオンライン上で同期を必要としたゲームなどを作る際に難しい部分の実装を担ってくれるプラットフォームになります。
　今回はPhoton自体の扱いはある程度できることを前提にして、Photonで使用するサーバを自分で用意したい人向けにその設定の仕方を書きます。
　例えば、ローカルのPCでサーバの設定をすることでオフライン環境でもPhotonを使った同期処理をすることが可能です。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">[Sample] Photon Two Player Test <a href="https://t.co/vqsx8pGBJw">https://t.co/vqsx8pGBJw</a></p>&mdash; pollenJP(@&#39;ω&#39;@) (@polleninjp) <a href="https://twitter.com/polleninjp/status/1076831262684246017?ref_src=twsrc%5Etfw">2018年12月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

↑Photon使った例

## 目次
- [目的](#目的)
- [目次](#目次)
- [環境](#環境)
- [Photon Server SDK](#photon-server-sdk)
    - [ダウンロード](#ダウンロード)
    - [インストール](#インストール)
    - [PhotonControlの起動](#photoncontrolの起動)
    - [IPの設定・確認](#IPの設定・確認)
    - [Load Balancingの起動](#load-balancingの起動)
- [サーバに接続](#サーバに接続)
    - [【方法1】PhotonServerSettingsの利用](#方法1photonserversettingsの利用)
    - [【方法2】関数にパラメータを渡す](#方法2関数にパラメータを渡す)

## 環境
- Windows10 (Windows以外では現在サポートされていません)
- Unity2018.13

今回動作確認をしたコードは以下にあげています。
https://github.com/pollenjp/learning_Unity3D_PhotonRealtime_TwoPlayers

## Photon Server SDK

### ダウンロード

[Photon Server SDK | Photon Engine](https://doc.photonengine.com/en-us/server/v3/sdks-and-api/sdk-photon-server)

　上のサイトに飛ぶと下のような画面が出てきます。「[DOWNLOAD THE PHOTON SERVER SDK](https://www.photonengine.com/en-us/sdks#serverserver)」をクリックして飛んでください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/b2c341cc-8ef5-bd5d-95d1-23bb69d93043.png)

　以下の画面に移ります。ここからダウンロードするのですが、注意が必要なのは現在の時点でうまく動作することが確認できるのは最新のV4ではなくv3なので「older versions」をクリックしてください。~~（v4で試してn時間消えた)~~

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/eac4feba-2790-5813-694b-458d94074924.png)

　すると今回の場合では「photon-server-sdk_v3-4-31-10808.exe」が表示されるのでそれをクリックすることでダウンロードできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/593afbb8-2eef-b6b6-68aa-71c4b59e068b.png)


### インストール

「photon-server-sdk_v3-4-31-10808.exe」をダブルクリックして解凍します。
下の写真で指定したパス上に展開されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/20905a03-9db1-8fce-c287-97d9e28432b3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/8d82fd6f-0ad3-9f4f-0062-16e9c18e404e.png)


### PhotonControlの起動

「ExitGames-Photon-Server-SDK_v3-4-31-10808」という名前のフォルダに解凍されるので、「ExitGames-Photon-Server-SDK_v3-4-31-10808  >> deploy >> bin_Win64 (bin_Win32) >> PhotonControl.exe」を開きます。

　これにより右下から`PhotonControl`にアクセスできるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/714083ee-2ec9-92c9-19c7-27d21a0a0e0e.png)


### IPの設定・確認

クライアントアプリケーションはIPアドレスを頼りにサーバと接続をするのでどのIPアドレスを使うか設定し確認します。(パブリックIPに設定していれば世界中からアクセスできますがファイアウォール等の基本的なネットワーク知識がないときはやらない方がいいかと)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/e6a81fdd-a404-7459-d6ac-a74564451497.png)

#### Load Balancingの起動

「Start as application」をクリックすれば起動しますのでサーバ側の設定は以上です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/d7ff8959-cfc3-1756-9f17-710a41787c95.png)


## サーバに接続

　Server SDK で建てたサーバとの接続は通常の Photon Cloud に接続する場合とほぼ同じです。

### 【方法1】PhotonServerSettingsの利用

　ネット上の記事を見る限り一番多いやり方は`PhotonServerSettings`に設定を書き込み、`PhotonNetwork.ConnectUsingSettings()`で呼び出す方法です。とても簡単でエラーが起きにくいので確かにこちらの方法がおすすめです。
　Hostingを`Self Hosted`に変更し、[IPの設置・確認](#IPの設置・確認)で確認したIPアドレスを入力します。 Server Portはデフォルトで5055番ポートを使うので通常通り起動していれば変更する必要はありません。ポート変換など行っている際は注意してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/d071a1f8-efae-416f-b996-5c4d195d8e6c.png)


### 【方法2】関数にパラメータを渡す

　`PhotonNetwork.ConnectToMaster()`にIPなどを情報を渡して実行することで、`OnConnectedToMaster()`が呼び出されます。

```
    PhotonNetwork.ConnectToMaster(
        masterServerAddress: str,
        port:                str,
        appID:               str,
        gameVersion:         str);
```

　`OnConnectedToMaster()`内で`PhotonNetwork.JoinLobby()`を呼び出せば、`PhotonServerSettings`内で Auto-Join Lobby にチェックを付けた状態になります。

```
    private void OnConnectedToMaster()
    {
      ...
      ...
      PhotonNetwork.JoinLobby();
    }
    
    private void OnJoinedLobby()
    {
    }
```


以上の設定をするだけであとは普通のPhotonのコードが動作します。


## おわりに
　Server SDKとは関係ありませんが、Photonの公式ドキュメントはまあまあ充実しており、読めば細かい内容は理解できます(~~わけのわからん部分もある~~)。しかし、最初のとっかかりとしてはやはり大変な気がします。僕は特にこちらの記事にお世話になりました。

- [マルチプレイオンラインゲーム開発 - Uniblo-ゆにブロ-](http://uniblo.biz/category/unity/mmogame)
- [【Unity】僕もPhotonを使いたい Unity-技術メモ-PUN カテゴリーの記事一覧 - うら干物書き](https://www.urablog.xyz/archive/category/Unity-%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2-PUN)



## 参考
- [Photon Unity Networking: Main Page](http://doc-api.photonengine.com/en/PUN/current/)
  - [PhotonPlayer [] PhotonNetwork.playerList](http://doc-api.photonengine.com/en/PUN/current/class_photon_network.html#a2dc5e6cba79f899d9952f804db35b2f3)
  - [PhotonPlayer [] PhotonNetwork.otherPlayers](http://doc-api.photonengine.com/en/PUN/current/class_photon_network.html#a894df24398c8cfe2d06e22ddc39576fa)
  - [bool PhotonNetwork.autoJoinLobby](http://doc-api.photonengine.com/en/PUN/current/class_photon_network.html#ad534d4da7222bd8a6d8423cbd238d7f4)
  - PhotonView
    - [void PhotonView.RPC()](https://doc-api.photonengine.com/en/pun/current/class_photon_view.html#ad288db13a15d581e0f7c5886f4036720)
- [Photon Server SDK | Photon Engine](https://doc.photonengine.com/en-us/server/v3/sdks-and-api/sdk-photon-server)
- [初期設定 | Photon Engine](https://doc.photonengine.com/ja-jp/pun/current/getting-started/initial-setup#connect_manually)
  - 手動で接続
- [Unityオンラインゲーム作成【Chapter12】Lobbyシーンの作成 - Uniblo-ゆにブロ-](http://uniblo.biz/unity/mmogame/lobbyscene)
- [【Unity】僕もPhotonを使いたい Unity-技術メモ-PUN カテゴリーの記事一覧 - うら干物書き](https://www.urablog.xyz/archive/category/Unity-%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2-PUN)
- [Unityで作る、画面遷移のあるメニュー - ころもソフトBlog](http://chicchi0531.hatenablog.com/entry/2017/10/10/025409)
- [PhotonNetwork.GetRoomList() always returns empty — Photon Engine](https://forum.photonengine.com/discussion/11094/photonnetwork-getroomlist-always-returns-empty)
- [Unity Photon(PUN+) の使い方 オブジェクト位置同期編（4/5） - 週刊SleepNel新聞](http://sleepnel.hatenablog.com/entry/2016/06/09/120200)
- [クイックスタート | Photon Engine](https://doc.photonengine.com/ja-jp/realtime/current/getting-started/quick-start)
- [PUNを使ってネットワーク同期を行う -Vol.1- – Photon](https://support.photonengine.jp/hc/ja/articles/218960867-PUN%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E5%90%8C%E6%9C%9F%E3%82%92%E8%A1%8C%E3%81%86-Vol-1-)
- [テクニカル – Photon](https://support.photonengine.jp/hc/ja/categories/201897318-%E3%83%86%E3%82%AF%E3%83%8B%E3%82%AB%E3%83%AB)