新機能紹介 (2.1)
Fusion 2.1には多くの新機能と改善が含まれています。このページでは、非常に重要な変更の詳細を説明します。Fusion 1から2への変更点は、新機能紹介 (2.0)をご覧ください。
Forecast Physics
Forecast Physicsは、物理演算の予測を完全にシミュレートする選択肢を提供します。これによって、より少ないCPU負荷で、リアルタイムの物理的インタラクションが発生するゲームが制作可能になります。

Forecast Physicsは、ホスト(サーバー)モードと共有モードで使用可能です。
補外を使用して、各プレイヤーのローカル時間で物理オブジェクトを移動させることで、すべてのクライアント上でスムーズなインタラクションを可能にしています。
詳細はドキュメントページをご覧ください。
Object Priority
Object Priorityによって、オブジェクトの更新レートを制御できます。Fusion 2.0以前は、すべてのオブジェクトは(可能なら)送信レートごとにネットワークプロパティを同期していました。Fusion 2.1では、Object Priorityを使用して送信レートを削減することが可能です。

- Object Priorityが
1
なら、オブジェクトは毎ティック更新されます。 2
なら、オブジェクトは2ティックに1回更新されるため、送信レートは1/2になります。3
なら、オブジェクトは3ティックに1回更新されるため、送信レートは1/3になります。
Proirityを指定する方法は2つあります。
Global Priority
オブジェクトのPriorityは、ネットワークオブジェクトのPriority
フィールドから設定します。これがオブジェクトのデフォルトのPriority値として、すべてのピア上で使用されます。
Per Player Priority
特定のプレイヤーに対して、オブジェクトの送信レートを調整することが可能です。
使用例として、プレイヤーとの距離に基づいてオブジェクトのPriorityを調整することで、関心領域(Area of Interest)を使用してオブジェクトを非表示にする以外の方法で、遠くのオブジェクトの帯域を削減することができます。
プレイヤーごとのPriorityは、ホスト(サーバー)モードと共有モードで使用可能です。
特定プレイヤーのPriorityを設定するには、以下のメソッドを呼び出します。
C#
NetworkObject.SetPriority(PlayerRef player, int priority)
- ホスト/サーバーモード:ホスト/サーバーが、Priorityを制御してすべてのプレイヤーとオブジェクトのペアを設定する必要があります。
- 共有モード:各クライアントが、受信するオブジェクトの送信レートを制御できます。そのため、
SetPriority
の引数はローカルのPlayerRef (NetworkRunner.LocalPlayer)
のみが有効です。
Priorityをクリアする(再びGlobal Priorityを使用する)には、以下を使用してください。
C#
NetworkObject.ClearPriority(PlayerRef player)
ホスト/サーバーモードでは、ネットワークオブジェクトが最初にプレイヤーへデータを送信する際に呼び出されるコールバックが存在します。これを実装することで、プレイヤーごとのPriorityが確実に設定されようにすることができます。
C#
public void Awake()
{
Object.PriorityCallback += PriorityCallback;
}
public void OnDestroy()
{
Object.PriorityCallback -= PriorityCallback;
}
public int PriorityCallback(NetworkObject obj, PlayerRef player)
{
int priority = 1; // ここに実装を追加する
return priority;
}
調整可能な共有モードのAOI
共有モードでは、関心領域(Area of Interest)のセルとグリッドのサイズをNetworkProjectConfig
から調整できます。Fusion 2.0以前では、これらは32で固定されていました。

大容量データのRPC
Fusion 2.1では、RPCの最大サイズ512バイト制限が撤廃されました。
512バイトを超えるRPCを送信するには、RPCの属性にRpcChannel.ReliableLargeData
を指定してください。
C#
[Rpc(Channel = RpcChannel.ReliableLargeData)]
public void RpcExample(byte[] data)
{
Debug.Log("Large RPC received");
}
- 大容量RPCは正確なティックでは呼び出されません。
- 大容量RPCは順序保証されません。
マスタークライアント切り替えの改善
マスタークライアントが応答不能になったものの完全には切断していないようなケースで、クライアントは手動でマスタークライアントの再割り当てをリクエストできます。これによって、より素早くマスタークライアントを切り替えることができます。
この機能を有効にするは、NetworkProjectConfig
のAllowMasterClientReassignRequest
を有効にしてください。デフォルトでは、再割り当てのしきい値は2秒です。これは、現在のマスタークライアントが応答していない(Photon Cloudからメッセージを受信していない)時間です。このしきい値は、NetworkProjectConfig
のMasterClientReassignRequestThreshold
値から調整可能です。
MasterClientReassignRequestThreshold
を0
に設定すると、現在のマスタークライアントが応答可能だったとしても、任意のクライアントがいつでもマスタークライアントを引き継ぐことができるようになります。ただしこれは、悪意のあるクライアント(ハッカー)が既存セッションを乗っ取るために悪用される可能性があります。
マスタークライアントが応答不能になった際に、自動的に切り替えが発生することはありません(自動的な切り替えは、完全に切断された際のみ発生します)。他のクライアントからの手動でのリクエストが必須です。以下のようにして、リクエストはどのクライアントからも送信できます。
C#
NetworkRunner.RequestMasterClientReassign();
クライアントはマスタークライアントが非アクティブになったかを検知するために、マスタークライアントによってネットワークプロパティが更新されているかどうかをチェックできます。毎ティック更新されているプロパティが存在しない場合は、独自トラッカーを追加できます。最小のセットアップは次の通りです。
- マスタークライアントは
FixedUpdateNetwork
で1つ目のint
型プロパティをインクリメントする。 - 「次のマスタークライアント」のインデックスを持つ2つ目のプロパティを定義する。そのクライアントは、マスタークライアントからの更新を受信しているかどうかをチェックして、1つ目のプロパティが一定秒数更新していない場合に
RequestMasterClientReassign
を呼び出す。
予測権限移譲
共有モードにおけるオブジェクトの予測権限移譲(Predicted Authority Transfer)は開発中で、2.1開発サイクル交換にリリース予定です。
共有モードのカスタムプラグイン
共有モードのカスタムプラグインで、Photon Server上からコードを実行できます。これによって、共有モードのアプリケーションにセキュリティーレイヤーを追加できます。
カスタムプラグインはEnterprise Cloudのみで利用可能です。
以下の例では、宝箱のコードをクライアント権限からカスタムプラグインに移行しています。
C#
// クライアントコード
public class Chest : NetworkBehaviour
{
[Networked]
private TickTimer _openCooldown { get; set;}
[Rpc(RpcSources.All, RpcTargets.StateAuthority, InvokeLocalMode = RpcInvokeLocalMode.ForwardToServer)]
private void RPC_Open(RpcInfo info = default)
{
///......
}
}
// プラグイン拡張
partial class Chest
{
public bool IsOpen => _openCooldown.IsRunning;
partial void RPC_Open(ref RpcInfo info)
{
// RPCは、StateAuthorityに転送されるかわりに、プラグインによって中断・キャンセルされる
info.Cancel();
if (IsOpen)
return;
// ネットワークプロパティが利用可能で、カスタムプラグインで処理できる
_openCooldown = TickTimer.CreateFromSeconds(Runner, _closeAfterTime);
for (int i = 0; i < _rollTables.Length; i++)
{
NetworkObject rollItem = _rollTables[i].Roll();
Vector2 randomOffset = Random.RandomInsideUnitCircle() * 0.25f;
randomOffset.x += i % 2 == 0 ? i * 0.5f : -i * 0.5f;
Vector3 position = BakedPluginData.Position + BakedPluginData.Rotation * Vector3.forward * 1.5f + new Vector3(randomOffset.x, 0.0f, randomOffset.y);
// プラグインは、ネットワークオブジェクトのスポーンのような操作を実行できる(ここでは宝箱内アイテムのスポーン)
NetworkObject rollInstance = Runner.Spawn(rollItem, position, BakedPluginData.Rotation);
}
}
}
Enterprise Cloudについての質問や、カスタムプラグインのアーリーアクセスにつきましては、こちらにお問い合わせください。
共有モードのティックレート
Fusion 2の共有モードのティックレートは32hz、送信レートは16hzで固定でした。
現時点ではFusion 2.1でも同様ですが、将来のリリースでは、送信レート32hz上限で、ティックレートと送信レートを広く選択できるようになります。
共有モード用ドキュメント
Fusionの共有モード用で、新しいシンプルなドキュメントを作成しました。
新しいドキュメントを確認するには、ドキュメントバージョンのドロップダウンを、Fusion 2
からFusion 2-Shared
に切り替えてください。(または、こちらをご覧ください)
この新ドキュメントのフィードバックを募集しています。これによって、Fusionの共有モードに興味のあるユーザーが、よりスムーズにFusionを導入できることを期待しています。
新しいFusion Hub
2.1は新しくデザインされたFusion Hubが搭載されています。共有モード専用プロジェクトには、関連コンテンツのみが表示され、開始プロセスを簡単にする新しい導入ワークフローが用意されています。


2.1では、Fusion Hubのさらなる追加機能が予定されています。
Photon Realtime
上級ユーザーのために、Photon Realtime APIを使用してルームを作成し、Fusionのセッションを初期化することが可能です。これによって、SQLロビー・マッチメイキングスロット予約・フレンドなどのRealtimeの機能が利用可能になります。
この機能の利用に興味がありましたら、こちらにお問い合わせください。
Player Unique Id
Fusion 2.1以降、セッション接続時(ホスト(サーバー)モードと共有モードの両方に対応)に、StartGameArgs.PlayerUniqueId
(long)からIDを渡すことができます。これによって、プレイヤーは一貫性のあるPlayerRef
を使用してセッションに接続できるようになります。
PlayerUniqueId
はPlayerRef
として使用されません。プレイヤーが初めてセッションへ接続する場合は、新しいPlayerRef
が作成されます。プレイヤーが以前に同じPlayerUniqueId
を使用したセッションへ接続する場合は、同じPlayerRef
が使用されます。
デバッグ用ブレークポイントのサポート
ホスト/サーバーモードでは、タイムアウトを引き起こさずに、ブレークポイントを使用したデバッグが可能です。Fusionのマルチピアモードと、UnityのMultiplayer Play Mode(MPPM)はどちらもサポートされています。
詳細な情報はドキュメントページをご覧ください。
Back to top