Photon Fusion 入門の入門
Photon Fusionとは?
「Photon Fusion」は、オンラインゲーム開発で必要になるリアルタイムのネットワーク通信・プレイヤー同士のマッチメイキングシステムなどの機能を提供するネットワークエンジンです。Unityにおけるオンラインゲーム開発の定番アセットの一つだった「PUN2(Photon Unity Networking 2)」の後継として、2022年3月に正式にリリースされました。
Fusionは従来のPUNと同じように、「Photon Cloud」というサービスで同時接続20人まで無料のサーバーが使えるため、オンラインゲーム開発を手軽に始めることができます。
対象読者
まず本質的な話ですが、オンラインゲーム開発は難易度が高いです。
Fusionにはオンラインゲーム開発を容易にする様々な機能が搭載されていますが、では全くのゲーム開発初心者がいきなり大規模な対戦ゲームやメタバースなどが作れるようになるか?というと、正直な所かなり厳しいでしょう。
この記事は、下記の少なくともどれか一つ(できれば全部)に当てはまる人を想定しています。
- Unityで小規模のシングルプレイのゲームを完成させた経験がある
- C#で中級程度のプログラミング知識がある
- オンラインゲームがめちゃくちゃ作りたくて仕方がない
初期設定
1. アカウントを登録してサインインする
Photon Cloudを利用するには、アプリケーションIDを取得する必要があります。Photonの公式サイトからアカウントの登録を済ませて、サインインしてください。
2. アプリケーションを作成する
サインイン後のダッシュボード画面で「新しくアプリを作成する」ボタンを押すと、新しいアプリケーションの作成画面になります。Photonの種別は「Fusion」を選択して、好きなアプリケーション名を入力したら、「作成する」ボタンを押してください。
アプリケーションが作成されると、ダッシュボード画面からアプリケーションIDが確認できるようになります。
3. Fusion SDKをダウンロードしてインポートする
以下の公式ドキュメントのページからFusion SDKをダウンロードしましょう。もしダウンロードに失敗する場合は、公式サイトに正常にサインインできているかを確認しましょう。また記事執筆時点では、Unityのアセットストアからはダウンロードできないので注意してください。
要件
- Unityはサポートされているバージョンか?(記事執筆時点でUnity 2020.3.x LTS以降)
- Asset Serialization ModeはForce Textになっているか?
Fusionを動作させるための要件を確認したら、Unityのプロジェクトを開いてFusion SDKをインポートしましょう。
メニューバーの「Assets > Import Package」からFusion SDKをインポートする
4. アプリケーションIDを設定する
Fusion SDKがインポートされると、Fusion Hubが自動的に開きます。自動で開かない、または後から開きたい場合は、メニューバーの「Fusion > Fusion Hub」から開きましょう。
Fusion Hubの「Fusion App Id」に先ほど取得したアプリケーションIDを設定をしてください。
正しいアプリケーションIDが設定されると、緑色のチェックが付きます。この状態が確認できたら、初期設定は完了になります。
予備知識
チュートリアルを始める前に、Fusionを使う上で知っておいて欲しいことをいくつか紹介します。専門的な用語が大量に出てくるので、最初から全て理解する必要はありませんが、よくわからなかった部分は理解が進んだ後に読み返してみることをオススメします。
ホストモードと共有モード
Fusionは様々なネットワークトポロジー(接続形態)に対応していて、開発したいゲームやアプリケーションの内容などに合わせて、最適なトポロジーを選択することができます。
Fusionのネットワークトポロジー(Photonの公式ドキュメントより)
選択したトポロジーによって、Fusionはホストモード(Host Mode)か共有モード(Shared Mode)のどちらかで動作します。非常に重要な点として、ホストモードと共有モードとではFusionの動作が異なるため、開発者は選択したモードに対応した実装を行う必要があります。
ホストモードの特徴
ホストモードは、Fusionが提供する高度な機能のほとんどを利用できます。ラグ補償(Lag Compensation)や、クライアントサイド予測(Client-Side Prediction)とサーバーリコンシリエーション(Server Reconciliation)によるロールバック・再シミュレーションなどを駆使することで、高い同期精度を実現できるでしょう。ただし機能を十分に理解して利用しないと予期せぬ不具合を起こしやすい部分もあるため、その分だけ学習コストや実装の難易度が高めとなります。
共有モードの特徴
共有モードは、従来のPUNとほぼ同様の動作になります。利用できるFusionの機能には制限がありますが、Photon Cloudのサーバーを利用して(専用サーバーを用意しなくても)安定した通信を行うことが可能です。主にメタバースや、高い同期精度を必要としないカジュアルなオンラインゲームの開発に適しています。学習コストや実装の難易度はホストモードに比べて低めなので、オンラインゲーム開発初心者の学習にも適しているほか、元々PUNなどを利用した経験がある開発者ならPUNからの移行もしやすいでしょう。
状態権限と入力権限
ホストモードと共有モードとの大きな違いの一つは、ネットワーク上で同期させるゲームオブジェクトとなるネットワークオブジェクト(Network Object)に対する権限です。
権限は、状態権限(State Authority)と入力権限(Input Authority)の二つに分かれています。一例として、各プレイヤーのアバターをネットワークオブジェクトにして同期するなら、状態と入力はそれぞれ以下のような値になるでしょう。
状態 | 入力 |
---|---|
アバターの位置 アバターの向き アバターのアニメーションのパラメーター |
コントローラーの方向キーの入力 コントローラーのボタンの入力 |
Fusionでは、ネットワークオブジェクトの状態権限を持つプレイヤーが、ネットワークオブジェクトの入力権限を持つプレイヤーの入力を取得して、その状態を更新する形になります。
ホストモードの動作
ホストモードでは、ホスト(サーバー)が全てのネットワークオブジェクトの状態権限を持ちます。クライアントに状態権限を持たせることはできません。クライアントは入力権限を持つネットワークオブジェクト(自分自身のアバターなど)を操作するために、入力をホストに送信し、ホストにその入力を反映してもらい、更新された状態をホストから受信する流れとなります。
共有モードの動作
共有モードでは、各クライアントがネットワークオブジェクトの状態権限を持つことができます。クライアントは自分自身が状態権限を持つネットワークオブジェクト(自分自身のアバターなど)の状態を更新して、互いに送受信し合います。入力の通信は行われずにローカルでのみ処理されるため、プレイヤーにネットワークオブジェクトの入力権限を持たせるかどうかは任意となります。
ネットワークプロパティとRPC
Fusionでネットワークの状態を同期するための方法には、ネットワークプロパティ(Networked Properties)とRPC(リモートプロシージャコール)の2つがあります。
[Networked]
public int Score { get; set; }
[Rpc(RpcSources.InputAuthority, RpcTargets.All)]
public void RpcSendMessage(string message) {
messageLabel.text = message;
}
ネットワークプロパティ
ネットワークプロパティは、ネットワーク上で同期される変数(プロパティ)として使うことができます。ある時点でのネットワークの状態全体をスナップショット(Snapshot)と呼び、これは全てのネットワークプロパティの集合になります。
RPC
RPCは、ネットワーク上で同期される関数(メソッド)として使うことができます。プレイヤー間で同期させたいイベント、複雑な入力、ネットワークの状態の同期には重要ではない一時的な情報の送受信などを行う時に便利です。
チュートリアル
ここからFusionを使ったオンラインゲーム開発のチュートリアルとして、簡単な3Dのプロジェクトを作成してみましょう。
確認環境
- Unity 2022.2.13f1
- Fusion SDK 1.1.8 F Build 725
- Cinemachine 2.9.5
- TextMeshPro 3.0.6
CinemachineとTextMeshProについて
CinemachineとTextMeshProはUnity公式のパッケージです。カメラ制御とテキスト表示で使いますので、インストールされていない場合はPackageManagerからインストールしてください。
シーンのセットアップ
チュートリアルは新規のシーンから始めます。事前にカメラの調整と地面を追加してください。
カメラの位置と角度を調整する
シーン上に地面を追加する
カメラ調整と地面追加後のゲーム画面
チュートリアルの開始
ホストモードのチュートリアルと共有モードのチュートリアルはそれぞれ別に用意しています。作成するゲームの内容自体は全く同じものですので、まず気になる方を試してみるか、どちらも試した上でそれぞれの実装コードの違いなどを確認してみるのがオススメです。
Discussion
Unityゲーム開発は経験がありますが、本記事を見ながらマルチプレイヤーゲームに初挑戦する者です。
開発しながら本記事の内容を検証(例 アバターが全プレイヤーのPCで同期して動く)するには、「複数PCを起動させ、開発中プロジェクトを同期させながら同時にゲームを起動する」のが必須でしょうか?
それとも、「1台のPCの1unityで、同時接続中の複数プレイヤーをエミュレートできる」のでしょうか?
1台のPCで確認する方法には以下のような選択肢があるので、気になる方法を試してみて下さい!
ありがとうございます。
まず、2番目parrelsyncをやってみます。
おかげさまで、ParrelSyncを利用して、2プレイヤーの同時アクセスを再現できるようになりました。
ありがとうございました。