Authoritative Server オーソリテーティブサーバー
Photonと物理演算
Photonは、デフォルトではシーンや物理演算を活用したり、それらと相互に影響しあうことはありません。
弊社は複数の3DエンジンへのPhotonのシームレスな統合を目指していますが、サーバー上で物理演算を実行するのは困難です。
また、弊社の経験からいってゲームごと(さらにはジャンルごと、タイトルごと)に要件が異なるため、標準化された容易な実現方法はありません。
。
さらに、こうした機能はマルチプレイヤーゲームをホスティングするうえで、最もコストがかかる部分になります。
Photon Server SDKを使用すれば、物理演算やその他の任意のモデルを使って、ゲームに対応したオーソリテーティブなサーバーを構築きます。
物理演算のオプション
オーソリテーティブサーバー構築のアプローチは複数存在します。
たとえば以下の考えではUnity3dを使用していますが、基本的にどの3Dゲームエンジンも同様の対応が可能です。
趣味の範囲内やプロトタイプのプロジェクトの場合には、この検討は不要です。
少数のプレイヤーならば、プレイヤーごとのコストやパフォーマンスを考慮する必要がないためです。開発作業に専念してください。
Unityインスタンスの実行
サーバー上でUnityのインスタンスを実際に実行できます。
Photon ServerロジックはC#で記述されるため、ルームごとに1つのUnityプロセスを起動し、それが別のクライアントであるかのように通信することができます。
ローカルではラグは増えません。ただしUnityインスタンスを起動、終了およびキャッシュするには、CPU、エンジンライセンス、自動化されたワークフローが必要です。ルームおよびシーンごとに1つのインスタンスを実行するほか、サーバー上のシーンをクライアント上のシーンと同期し続ける必要があります。
Unityの物理演算は、プラットフォーム間での予測をおこないません。
サーバーとクライアント間の違いによって、時間が経過するにつれてUnityは異なる結果を提供するため、アップデートが必要です。
Collision Detectionライブラリの使用
現在弊社が推奨している「オーソリテーティブサーバー」モデルでは、レベルデータをエクスポートする際に単純化した「物理演算」エンジンを使用します。
作業が必要ですが、実行時のコストを抑えたうえで最適な結果を得られます。
ほとんどの場合、ゲームには衝突の検知のみが必要です:別のユニットへの衝突は、そのユニットを弾丸や剣で打ち返すということではありません。必要なのは、その衝突の把握です。
Unityでのトリガーはこれに似ています:実際の物理エンティティではなく、コールバックをともなうボックスまたはメッシュが重なった場合にコードが反応します。
「物理演算」をイベント起動に抑えれば、パフォーマンスを保持できます。
ゲームによっては、Unityの物理演算を使わない方が良い場合があります。
単純な2D衝突検出エンジンで十分かもしれません。
UnityやPhotonでは、すべてのC#ベースエンジンを利用できます。
このエンジンによって、両方の側で同一のコードの実行が可能です。
多くのゲームで、ナビゲーションに単純化したメッシュを使用しています。
クライアント側でも同様です。
たとえばプレイヤーが進める場所についてのみ知りたい時に、シーン内の芝生1本ずつをロードする必要はありません。
単純化されたレベルがあるならば、サーバーではそのレベルのみを使うほうが良い場合があります。
ユーザーによっては、エディターからエクスポーターを書き込んでいます。レベルのセットアップに利用したり、結果をサーバーに使用できるようにするためです。
物理演算の通信
サーバーが対象物の移動に実際のロジックを実行している場合、プレイヤーからの入力さえあれば、その結果としての移動やイベントによってすべてがアップデートされます。
クライアントが入力を「提出」できるよう、サーバー上に操作を実装できます。
たとえば、操作「Move」などです。
操作RaiseEvent
とは異なり、これらの操作はクライアントのデータを全員に送信するのではなく、特定のアイテムのサーバーステートをアップデートします。
入力されたパラメータは、クライアントから見た位置や移動のデータと混合されます。
サーバーでは、間隔をおいてロジックを実行できます(RequestFiber.Schedule()
or RequestFiber.ScheduleOnInterval()
を使用)。
移動を変更させたものはすべて、クライアントにアップデートを送信する必要があります。この送信は、Photonのイベント経由で実行できます。イベントごとにアイテム移動のリストを送信可能です:それぞれID、位置、場合によっては速度などが必要です。必要に応じて情報を追加してください。
アップデートの合間にクライアントが数フレームを追加できるようにすると、トラフィックを節減できます。
これは、プレイヤー数が増えるとより重要になります:たった32人のプレイヤーでも、イベントで20アップデート/秒を2byteごとに送信するとトラフィックは約1KBになります。
1つのPhotonイベントを複数のクライアントに送信できれば、シリアル化の作業が減ります。
移動アイテムが多すぎる場合には、プレイヤーごと、リージョンごと、またはその他の方法で、興味のないものを除去する必要があります。