Photon TrueSync イントロ
はじめに
Photon TrueSyncは、Photon Unity Networking上に構築されたUnityのマルチプレイヤーロックステップシステムです。
TrueSyncでは、クライアントマシンはそれぞれのプレイヤーによって生成された入力のみを交換し、シミュレーションはゲームクライアント間でロックステップし、帯域幅要件を大幅に削減し、完璧な同期を可能にします。
開発者がマシン間でシミュレーションを確定的に保てるよう、カスタム物理エンジンと、その他のクラスが含まれています。
TrueSyncは、Unityが対応しているほぼすべてのプラットフォームにエクスポートできます。
必要なコード
TrueSyncを最大限に活用するには、いくつかのスクリプトを書く必要があります。
このページでは、始めるための最も重要なスクリプトを紹介します。
TrueSyncの確定的セクションの開始
TrueSyncのセクションは、PUN(Photon Unity Network)ルームに接続されたゲームクライアント間で行われるため、ルームの設定と作成/参加方法のドキュメントを参照してください。
実際のTrueSync管理されたゲームプレイセクションは、ゲームオブジェクトに添付されたTrueSyncManagerコンポーネントを含むシーンがPUNを介して同期ロードされると、マスタークライアントによって開始されます。
TrueSyncManagerは、ゲームクライアントがルームに接続されているかどうかを確認します。これは、マルチプレイヤーのロックステップセクションを開始することを意味します。
PUNルームに接続せずに使用することもできます。この場合、システムはオフラインモードで動作します。これは、ゲームのシングルプレイヤー部分に同じコードとコンポーネントを使用するのに最適です。
入力のキューイング
ロックステップシステムでは、ローカルプレイヤーからの入力をゲームプレイコードで使用する前にキューに入れなければなりません。
そうすることにより、システムは、リモートプレイヤーからの入力を待ち、キューに入れられたローカルの入力と同期させることができます。
C#
public override void OnSyncedInput () {
FP x = Input.GetAxis("Horizontal");
TrueSyncInput.SetFP(0, x);
}
ローカルクライアントとリモートクライアントの両方で使用するTrueSyncの入力キューにプレイヤーの入力を登録するために必要なのは上記のコードのみです。
最初のパラメータはキーなので、必要に応じて複数の入力値を登録できます。
floatからFixedPoint(FP)に変換する必要があります。
float(浮動)小数点数は、異なるアーキテクチャーでまったく同じように計算されるわけではありません。したがって、すべてのクライアントでシミュレーションを同期させる必要があります。
入力を使用してgamestateを更新
次に、Unity上の他のゲームと同じように、入力値を使用してゲームオブジェクトを更新します。
違いは、Unityから直接ではなく、TrueSyncのキューシステムから入力値を取得することです。
C#
public override void OnSyncedUpdate () {
TSVector move = new TSVector(TrueSyncInput.GetInt(0), 0, 0);
tsTransform.Translate(move * TrueSyncManager.DeltaTime);
}
上記のコードは、TSVectorクラスも示しています。これは、Unity Vector3とまったく同じ方法で動作しますが、x、y、zのfloatではなくFPを使用します。
Unityの代わりにTrueSyncのデルタタイムを使用していることにもご注目ください。
物理
TrueSyncには、2Dゲーム用と3D用の2つのカスタム物理エンジンが搭載されています。
どちらも、Unityの元の物理エンジンのものと非常によく似たコンポーネントアーキテクチャとAPIを使用しています。
TrueSyncには、組み込まれた物理エンジンの使い方を説明するいくつかのゲームサンプルが含まれています。
下のコードは、物理剛体のTrueSyncの決定論的なバージョンであるTSRigidbodyに力を加える方法を示しています。
C#
public override void OnSyncedUpdate () {
TSRigidBody rb = GetComponent<TSRigidBody>();
rb.AddForce(TSVector.forward * TrueSyncManager.DeltaTime);
}
コリジョンとトリガはUnityの物理的な対応と同じように機能しますが、すべてのコールバックメソッドは "OnSynced"で始まります。つまり、TrueSyncの確定的物理エンジンから呼び出されます。
C#
public void OnSyncedCollisionEnter(GameObject other) {
Destroy(other);
}
Back to top