Photon Fusion for Unityを使った自分のプロダクトをサーバーモードに対応させる～準備編

# *はじめ*に

Photon FusionはドイツのExit Games社が開発し、GMOグローバルサイン・ホールディングス株式会社が日本展開を行っているオンラインゲーム開発向けネットワークエンジンです。

過去の記事では基本的な使い方を中心に紹介してきましたが、殆どがサーバーへのデプロイを必要としないモードの解説でした。

しかし、サーバーへのデプロイを前提にしたゲームを作りたい、例えば多人数対戦ゲームでセキュリティや安定性を高めたい、MMORPGのように常時稼働させたい、といった場合があるかと思います。

前者の場合はBR200、それ以外の場合はFusion Dedicated Serverサンプルが参考になります。

https://qiita.com/nimushiki/items/dde8614c8173cd6537e0

https://doc.photonengine.com/ja-jp/fusion/current/game-samples/fusion-br/overview

https://doc.photonengine.com/ja-jp/fusion/current/technical-samples/dedicated-server/fusion-dedicated-server

Fusion Dedicated Serverサンプルの解説ページには、ビルドして実行する（自PCでサーバー側プログラムを動かす）までと、実装についての解説があります。

しかしその先のサーバーへデプロイする部分については個々人の状況による部分が多く、具体例がありません。

そこで本記事ではサンプルプログラムをUGSへデプロイして動かす手順についてまとめました。

### 前提記事

Photon Fusionの基本的な解説は別記事で行っています。詳しく知りたい方は以下のリンクからご参照下さい。

[Photon Fusion for Unityの導入手順とPUN2との機能比較](https://qiita.com/nimushiki/items/d6fe4f0cbe0437677fa8)

関連記事

[https://qiita.com/tags/photonfusion](https://qiita.com/tags/photonfusion)

### 動作確認環境

Windows 10 Home 21H2

Unity 2020.3.38f1

Fusion Dedicated Server 1.1.2 Build 2

### UGSのGSHとは

UGSとはUnity Gaming Serviceの略で、Unityが提供する様々なオンラインサービスの総称です。

https://unity.com/ja/solutions/gaming-services

今回はUGSのうち、Game Server Hosting（その前提のCloud Content Delivery）をサーバープログラムを設置するために利用します。

サービスは従量課金制ですが、無料枠が多く試しに動かしてみる程度なら無料枠を超えることはないと思われます。

ただし無料枠を超えないにしても、有料サービスを有効化するためクレジットカードが必要になります。

# 手順

## Unityでの作業

### 初期設定

まずはFusion Dedicated Serverサンプルの解説ページからサンプルプロジェクトをダウンロードし、Unity Editorで開きます。

https://doc.photonengine.com/ja-jp/fusion/current/technical-samples/dedicated-server/fusion-dedicated-server

PhotonのダッシュボードでAppIDを作成して適用、UnityEditorの　Edit＞Project Setting＞Services＞Create ProjectID　でUnity ProjectIDを作成しリンクしておきます。

### サーバープログラムのビルド

準備として、Unity HubからLinux Build Support IL2CPPモジュールを追加し、Project Setting＞Player＞Configurasion＞Scripting Backend　を　IL2CPP　に変更しておく必要があります。

その後Target PlatformをLinuxに変更しビルドします。
![Target PlatformをLinuxに](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/8900883d-b244-45c6-ee2e-70e4b9c3e62f.png)


### クライアントのビルド

Unity Editor以外も使って多数の接続テストをする場合はクライアントもビルドします。

Target Platformはwindowsのままビルドすれば問題ありませんが、サーバー版のファイルと混ざらないようフォルダは分けておいたほうがよいでしょう。

## UGSでの作業

### UGSとGame Server Hostingの有効化

まずリンク先の「今すぐ仕様を開始する」から進みUGSを有効化する必要があります。

https://unity.com/ja/solutions/gaming-services

![Game Server Hosting](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/08c4f720-5aeb-dbb5-95b1-8f01415c9232.png)


### Game Server Hostingの設定

コンソールのMultiplayerを開くとSetup guideが開くため、それに従い進めます。
![Setup guide](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/6e419d70-4251-fdb0-30c9-be3a0a77d095.png)


参考

https://docs.unity.com/game-server-hosting/concepts/build-configurations.html

### Integrate game server

途中SDKを入れるよう指示がありますが、サンプルプログラムに組み込まれているため飛ばします。

### Create a build

Build nameは適当な名前で問題ありません。
![Create build](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/43552392-d9b2-cfa8-2b39-9db20705923d.png)

Uploadするファイルは、ビルドしたサーバープログラムフォルダのうち以下のファイルです。

- *.so ファイル
- *.x86_64 ファイル
- *_Data フォルダー

### Create a Build configuration
![Create Build configuration](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/5989a857-c435-8657-26ae-b3bc16b5da47.png)

Game server executable　は　.x86_64　ファイルを選択します。

launch parameters　は　`-batchmode -nographics -logFile $$log_dir$$/Engine.log`　に書き換えます。

Configuration variables、Usage settingsはデフォルトで問題ありません。

### Create a fleet

Fleet nameは適当で問題ありません。
![Create a fleet](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/dd3629cb-0ec2-63fe-e76f-cd08fe1775af.png)

Regionはasia、serversはminを1、maxを2にします。

### Create a test allocation

設定が問題ないかをテストします。

テスト後Test Allocationsは不要なので、Deallocateで削除して問題ありません。

## 動作確認

ここまで完了したら、あとは任意のServer instanceを立ち上げ、クライアントプログラムを起動します。

# その他

##  UnityGamingServicesでの接続数表示について

現在の状態ではUGS上で接続数がカウントされません。

3クライアント接続してもカウントされていない様子
![3クライアント接続してもカウントされていない様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/62e93403-1d4f-4521-32ef-2b3f4e9f766d.png)

カウントをするには、Build configurationのQuery TypeをSQP(Server Query Protocol)に変更し、プログラム側で初期化等をする必要があります。詳しくは今後の記事で解説する予定です。

https://docs.unity.com/game-server-hosting/en/manual/concepts/sqp

## さいごに

自分はサーバーを使って常時接続可能なオンラインゲームの制作は初めてで、サーバーサイドの知識もほぼない状態でした。しかしそれでも動かすところまでは非常に手早く進むことができました。

ただし、今後ゲームロジックを実装していくにあたって、考慮すべき部分については確認できていないため、今後別の記事でまとめていく予定です。