This document is about: FUSION 2
SWITCH TO

Fusionプロトコルにおける信頼性のある通信の例外

Level
ADVANCED

大抵のケースでは、「信頼性のあるRPC」と「ネットワークプロパティの変更」は他のピアに同期されることが保証されます。ネットワーク上のパケットが損失したとしても、Fusionは損失したデータを再同期します。

ネットワークプロパティ

ネットワークプロパティのデータの同期には、結果整合性が適用されます。

ただし、以下に示すように、結果整合性が保証されない、または意図しない結果をもたらすエッジケースがいくつか存在します。

短時間に連続して複数回変更を行う

ネットワークプロパティを短時間に連続して変更すると、結果整合性の仕組み上、いくつかの変更が検知されない可能性があります。

例:

  1. 整数型のネットワークプロパティを、短時間に連続して5から66から7に変更すると、他のピアは5から7の一つの変更のみを受信する可能性があります。
  2. ブール型のネットワークプロパティを、短時間に連続してTrueからFalseFalseからTrueに変更すると、他のピアは変更を受信しない(TrueからTrueになるため)可能性があります。こういったケースでは、整数型のネットワークプロパティを使用して、変更ごとに値をインクリメントし、偶数False奇数Trueで表すことを推奨します。

共有モードの予測

共有モードで状態権限を持たずにネットワークプロパティの値を設定すると、共有モードの予測になります。これによって、

  1. 変更はローカルのみに反映され、他のピアには同期されません。
  2. ホスト/サーバーモードとは異なり、予測は一定時間経過後に自動リセットされません。ネットワークプロパティの値について、ピア間で永続的な同期ズレが発生する可能性があります。
  3. 状態権限者が次の値を設定し、その状態変更の値を受信すると、予測した値は上書きされます。
Fusion 2.1

Fusion 2.1の新メソッドNetworkObject.ResetToLatestState()を呼び出すことで、そのネットワークオブジェクトのネットワークプロパティについて、すべての共有モードの予測をローカルでリセットできます。

状態権限の変更

共有モードでは、状態権限を持つクライアントがネットワークプロパティの値を設定した場合、その変更が他のクライアントに同期されます。ただし、別のクライアントが同じオブジェクトに対して同時にRequestStateAuthorityを呼び出した場合、変更が同期されずに共有モードの予測になる可能性があります。予測は常に一時的なもので、Photon Serverプラグインがオブジェクトに新しい状態権限者を割り当てた時点で、前の状態権限者が(新しい状態権限者の)正しい状態を受け取ります。

RPC

信頼性のあるRPCは、以下のケースを除き、確実に到達することが保証されます。

  1. 受信ピアに、対象のネットワークオブジェクトが存在しない場合(デスポーン済み、またはまだスポーンしていない)
  2. RPC送信中に、ネットワークオブジェクトの状態権限/入力権限が変更された場合(詳細は後述)
  3. RPCの送信/受信中に、クライアントが完全に切断された場合

静的RPCを使用すると、ネットワークオブジェクトの存在や状態権限の有無にかかわらず、RPCを到達させることができます。

スポーン直後のRPC

Spawned()内やネットワークオブジェクト生成直後に送信されたRPCが、確実に到達する保証はありません。ネットワークオブジェクトがスポーンする前にRPCが到達する競合状態が発生し、RPCが破棄される可能性があります。

デスポーン直前のRPC

ネットワークオブジェクトがデスポーンされると同時または直前に送信されたRPCは、実行される保証がありません。RPCはネットワークオブジェクトがデスポーンされる前後に到達するため、デスポーン後に到達したRPCは破棄されます。

デスポーン前にRPCが実行されることを保証するには、ネットワークオブジェクトをデスポーンする前に、対象からRPCを受信したかどうかのRPCを送信してもらう必要があります。

共有モードのRPC

RpcSource.StateAuthorityのRPCが到達する前に、Photon Cloudプラグイン上でネットワークオブジェクトの状態権限が変更された場合、そのRPCは破棄されます。RpcSources.Allを使用することでRPCの到達を保証できますが、手動で状態権限のチェックが必要です。

RpcTarget.StateAuthorityのRPCが到達する前に、Photon Cloudプラグイン上でネットワークオブジェクトの状態権限が変更された場合、そのRPCは破棄されます。ターゲットを状態権限者に設定したターゲットRPCを使用することで、RPCの到達を保証できます。

ホスト/サーバーモードのRPC

入力権限者(クライアント)から状態権限者(サーバー)へ送信されたRPCは、サーバー受信時に入力権限がチェックされます。サーバー上でネットワークオブジェクトの入力権限が変更された後に、変更前の入力権限者からのRpcSources.InputAuthorityのRPCを受信した場合、そのRPCは破棄されます。

RpcSources.Allを使用すると、サーバー上で常にRPCを呼び出すことができますが、手動で入力権限のチェックが必要です。

Back to top