Overview
Simpleは、PUN2の拡張ライブラリです。タイミングメカニズムや圧縮、syncvar、よく使われるコンポーネントシステムを追加します。
PUN2ライブラリは主に1つのクライアントのフィールドやイベントを、キャプチャや同期で、タイミングも決定性命令も強制することなく再現することにフォーカスしています。
それに対しSimpleは、独自のアップデートマネージャシングルトン(NetMaster
およびNetMasterLate
)を使用して、ネットワーク用のマスタータイミングセグメントを作成します。
Simpleはまた、浮動小数点やvector3、クォータニオンの圧縮に特化したビットパッキングライブラリを搭載しています。
SimpleはGitHubからダウンロードしてください。
目次
Libary Highlights
コンポーネントとインターフェースの基本セット
新しい拡張ライブラリの最初の利点は、相互運用コンポーネントの形で存在するコードの量です。 コードを書かなくても、同期されたネットワークシーンを持つことができます。
- 変形
- アニメーター
- Hitscans & Projectiles
- 体力/バイタルとUIの自動化
- 状態(Attached、Visible、Thrown/Droppedなど)
- 状態の変化に応じた可視性/リジッドボディの変化
- 他のオブジェクトへの取り付け
- ダメージ/回復/バフ/デバフゾーン
- インベントリ及びインベントリアイテム
- 体力/エネルギーのピックアップ
これらのコンポーネントは派生して拡張することもできます。また、ベースとなるインターフェイスを使用して、これらのシステムと相互作用するコンポーネントを一から作成することもできます。
セグメント化された遅延時間のシミュレーションベースのティックシステム
NetMasterシングルトンは、中央のアップデートマネージャーとして機能するため、システム全体がティックごとにポーリングされ、PreSimulation、PostSimulaton、State Capture、Serialization、 Deserialization、State Application、Interpolation、Extrapolationコードの実行を厳密に制御する一連のティック・ベースのコールバックを生成します。 これにより、競合状態を排除し、すべてのオブジェクトを自身と同じ所有者を持つ他のオブジェクトに厳密に同期させます。 このようにして、多くのことが本質的に決定論的になります。 例えば、プレイヤーがヒットスキャンをトリガーすると、ショットは同じ順序で状態を適用することで他のクライアント上で複製され、所有者上で起こったようにヒットスキャンが再現されます。
Simpleコンポーネントのセットは、FixedUpdate()をベースにしたタイミングを使用してシミュレーション/移動/アニメーションを行うゲーム用に調整されています。 これは、シミュレーションフリーやUpdate()ベースのシミュレーションでも動作するように設計されていますが、一般的にはネットワーキングには理想的ではなく、マイクロジッターが発生しやすいです。 順番をより確実にするためにはNetMasterのタイミングセグメントを使用することをお勧めします。
- すべてのゲームロジックをFixedで行う - OnPreSimulateとOnPostSimulateで実行します。
- Update ですべての内挿/外挿を実行 - OnPreUpdate、OnPostUpate、OnPreLateUpdate、OnPostLateUpdate。
Numbered State Buffers (Circular Buffer)
コアのFixedUpdateベースのタイミングシステムは、一定のタイミングで所有するオブジェクトの状態をキャプチャします。 これらは所有者上のサーキュラーバッファに格納され、すべてのクライアントにシリアライズされ、そこでローカルのサーキュラーバッファにデシリアライズされます。 これらの番号付けされたステートはパケットロスがあっても状態のスムーズな内挿/外挿を可能にし、所有者を共有するすべてのオブジェクト間の同期を維持します。
ネットワーキングは、主に所有者から他のクライアントにこれらの状態バッファを転送することで構成されています(クライアントから他のクライアントにフィールド値を直接複製するのではなく)。
圧縮ライブラリ
Simpleは、SyncObjects
やPackObjects
(Syncvars)などのシリアライズ化に使用する圧縮ライブラリを搭載しています。
これらのツールを使用すると値を、byte[]やその他プリミティブ型整数に直接書き込んだり、そこから直接読み込んだりすることができます。
浮動数、Vector2、Vector3、クォータニオン型の圧縮に特化したコンプレッサもあります。
統一されたビットパック型のbyte[]配列へのシリアル化の書き込み
これにより、非常に高いレベルのデータ圧縮が可能になります。また、コンポーネントでインラインのシリアル化ロジックを使用することも可能になります。 書き込みは、各シミュレーション(PostPhysX)の直後に NetMaster から 単一のタイミングで開始され、単一の byte[] 配列が状態を生成するすべての NetObject に渡されます。
散らばったオブジェクトが Write() メソッドを呼び出してその場しのぎで呼び出すのではなく、高度に圧縮された厳密な順序のbyte[] が生成され、箱詰め/解除の必要もありません。
ビットバッキングの例 : PhotonAnimatorView
(PUN2) とSyncAnimator
(Simple)の比較
Uncompressed (PUN2) | Bitpacked (Simple) | |
---|---|---|
Normalized Floats | 40 bits | 2-16 bits |
Other Floats | 40 bits | 2-16 bits |
State/Trigger Hashes | 40 bits | 1-8 bits |
Bools/Triggers | 16 bits | 1 bit |
コアシミュレーションのティックタイミングシステムに接続されたSyncvars
PackObject を使用すると、フィールドに属性をタグ付けすることができ、NetObjects/SyncObjects と同じ遅延時間でOwnerからAllまでの値を同期させるコードを自動的に生成します。 つまり、自分でSyncObjectを書かなくても、簡単にフィールドを同期させることができます。 Syncvarsには圧縮オプションが組み込まれており、上級者は自分で圧縮メソッドを書くこともできます。
キーフレームに基づく結果整合性
クライアントとサーバの間で結果整合性を交渉するためにAckを使用するのではなく (すべてのクライアントが他のクライアントと信頼性を交渉しなければならないリレー環境では非常に面倒になります)、Simpleのシステムは、主にキーフレームとデルタフレームを使った信頼性の低いUDPを使用します。 パケットの紛失や遅延は所有者と他のクライアントの間で状態の不一致を引き起こしますが、強制更新 (キーフレームや変更) が到着したときに、最終的に解決されます。 組み込まれているコンポーネントの多くには、自分で設定できるキーフレームレート値があります。 この値でキーフレームの頻度を定義します。 めったに変更されないアイテムにとっては、これが望まない量の余計なトラフィックを生み出すことになるため、キーフレームレートを0にして変更をリライアブルで送信させるオプションもあります。
はじめに
SimpleはGitHubからダウンロードします。
このライブラリを使用する前に、まずチュートリアルを実行してSimpleのコンポーネントやワークフローに慣れておくことをお勧めします。
使用について
このライブラリには、PhotonTransformViewとPhotonAnimatorViewの代替と、バイタルやアイテム、ステートなどの同期などの、ネットワーキングによくある一般的なオブジェクトを扱うドロップインコンポーネントが含まれています。
開始するには、Sinmpeライブラリをインストールし、以下を行います。
PhotonTransformView
の使用をSyncTransform
に置き換えるPhotonAnimatorView
の使用をSyncAnimator
に置き換える
その後、Assistを使用してオブジェクトの返還・追加を行い、Simpleで使用できるコンポーネントを見てみましょう。 本ライブラリを使用する前に 入門チュートリアル を行ってください。
自分のコードでライブラリを参照するにはインクルードを使用します。
using Photon.Pun.Simple;
Assist
アシストは、ネットワークオブジェクトの作成/変換のタスクを自動化するメニュー項目であり、このデモ全体で使用されています。基本的にはワンクリックのウィザードで、インターフェイスはありません。 Unityで選択されたゲームオブジェクトに対してタスクを実行しようとしたり、該当する場合は新しいシーンオブジェクトを作成したりします。
コンポーネントの手順
Simpleのライブラリのほとんどのコンポーネントには、カスタムヘッダにInstructionsの折り畳みを含むか、ドキュメントへのリンク([?]アイコンで表示)があります。 目的は、基本コンポーネントのほとんどがデフォルトで十分に動作するようにして、このドキュメントを極力読まないで良いようにすることです。 ただし、いくつかの概念やAPIコンポーネントは、システムが複雑なので、ドキュメントを参照する必要があります。