フリーズ、アイドル、SetScope
Boltには、特定のエンティティに対する状態のアップデートがリモートで送信されるかどうかを管理する3つの異なるメソッドがあります。
これはマップが大きく、プレイヤーが遠くにいる他のエンティティからデータを受け取る必要のない場合などに便利です。
これらのユーティリティは、特定のエンティティのアップデートを意識する必要があるのが一部のプレイヤーのみの場合などに、主に帯域幅とゲームサーバー上での処理能力を節約するのに使用されます。
以下のメソッドはすべてBoltEntityから直接使用可能で、エンティティごとや場合によっては接続ごとに個別に設定できます。これにより、クライアントが通知を受けるべきエンティティをフィルタリングするのに必要な柔軟性が生まれます。
エンティティをスコープする
特定の接続で、エンティティが存在する必要があるかの信号をBoltに送るため、Scopeについて説明します。
これはBoltEntityのAPIに含まれているSetScope(BoltConnection connection, bool inScope, bool force)メソッドで、まさにこれ自体を設定することができます。
このメソッドを呼び出す際に接続と、inScopeのブーリアン値、任意のforceブーリアンをパスします。
trueをパスした場合は、そのエンティティは接続の反対側で作成され、状態のアップデートを受け取ります。
エンティティがリモートエンドに既に存在する場合、何も発生しません。
falseをパスした場合、接続の反対側でエンティティは完全に破壊されます。
接続の反対側にエンティティが存在しない場合、falseをパスしてもなにも発生しません。
デフォルトでは、接続がコントロールしているエンティティをスコープから削除できません。エラーメッセージが表示されます。
本当にエンティティを削除する必要がある場合は、forceパラメータにtrueをパスしてバリア取り除くことで行えます。
falseをパスすることでリモート接続のエンティティを破壊する場合、次にtrueをパスして作成する際には、このエンティティのすべてのデータをネットワークで再度送信する必要があります。
SetScopeを使用可能にするには、Bolt設定ウィンドウでScoping Modeを自動(Automatic)から手動(Manual)にする必要があります。
スコーピングに手動(Manual)モードを使用する場合は、各接続の各エンティティでスコープの値を設定する必要があります。
SetScopeを使用する例
プレイヤーキャラクターが、シーンの読み込みが必要なゲーム内の他の場所に移動される場合、entity.SetScope(playerConnection, false)がそのプレイヤーがそれまで居た場所に存在する全てのエンティティを破壊します。
エンティティをアイドリングする
エンティティをアイドルとして設定することは、更新されたフローのコントローsるに使用するまた別のテクニックとなります。
これに使用するメソッドはentity.Idle(BoltConnection connection, bool idle)です。接続とブーリアンのtrue/false値をパスします。
trueを渡すと、このエンティティはパスされた接続上でこれは アイドル となり、状態のアップデートの送信は停止されます。
falseを渡すと、アイドル 状態が削除され、再び情報のアップデートがおこなわれることなります。
これは 接続ごと に行われ、設定できる全体的な アイドル 状態はありません。
アイドルを使用する例
インタレスト機能のタイプを実装し、特定のプレイヤーがワールド内のエンティティのインタレストエリアを離れる場合、エンティティに対してentity.Idle(PlayerConnection, true)を設定すると、プレイヤーへの転送からの状態アップデートは全て停止します。
エンティティをフリーズする
Freezeは、ネットワークトラフィックとCPUの保存に関する最新のメソッドです。
Freezeは、エンティティの オーナー 上で有効化/無効化が可能なグローバル設定です。
entity.Freeze(true)を呼び出すと、以下が発生します。
- すべてのBolt
Simulate*メソッドが呼び出されるわけではありません。 - プロパティコールバックは、いずれも呼び出されません。
- 状態の変化はネットワーク上で誰にも送信されなくなります。
それに対するプロキシを受け取った全員についてエンティティは存在し続けることとなり、イベントの引き出しや、別の状態プロパティ情のパラメータとして設定するなど、その他のBoltの機能と共に使用可能です。
entity.Freeze(false)を呼ぶと、以下が発生します。
- Boltはまた
Simulate*を呼び出すようになります。 - すべての保留中のプロパティコールバックが呼び出されます。
- 変更された状態が、すべてのリモートに対してネットワーク上で複製されるようになります。
Freezeを用いる例
大きなワールドに対してインタレストソリューションの領域を構築する場合には、特定のプレイヤーのそれぞれの接続に対するアイドル状態の呼び出しが正しい一方、ワールド内のエンティティの近くにプレイヤーが 全く居ない 場合には、サーバー上のCPUリソースを節約するためentity.Freeze(true)を呼び出したいという場合もあるでしょう。