BoltEntity

BoltEntityは、Boltによりネットワーク上で表されるUnityのゲームオブジェクトです。

BoltEntityは、UnityまたはuLinkのNetworkViewまたはPUNのPhotonViewに類似しています。 これはネットワーク・アウェアのオブジェクトを表すものであり、BoltがUnity内の実際のゲームオブジェクトを管理・複製するための基盤となるものです。

BoltEntityは、サーバーでもクライアント でもありません。代わりに、以下のものである可能性があります。

  1. Ownedentity.isOwner == trueの場合。
  2. Controlledentity.hasControl == trueの場合。
  3. Proxyentity.isOwner == false && entity.hasControl == falseの場合。

オーナー、コントローラー、プロキシについての詳細はこちらを参照してください。

BoltEntityを他のものに同期する

状態をOwnerから他のクライアントに同期させるには、状態 の作成が必要です。 これはBoltの Editor から行うことができます。 状態の作成・変更後には、必ずBolt Assetをリコンパイルして下さい。

Back To Top

BoltEntityの管理

BoltEntityの管理について設定するには、そのエンティティのExecuteCommand()SimulateController()メソッドをオーバーライドする必要があります。 これは通常、クライアント側の予測 により行われます。 ただし、BoltEntityの実際の状態についてオーナーは完全な管理を所有し続けます。

オーソリテーティブな移動、およびクライアントに予測された移動を用いる場合には変換コンポーネントを直接用いるか、Character Controllerコンポーネントを用いる必要があります。 Mecanimのルートモーションまたはrigidbodiesは、キャラクターの管理に使用できません。

Back To Top

メソッド: BoltEntity.SimulateController()

エンティティの管理を割り当てられている人物上でのみ動作します。 これは、TakeControl()をエンティティに対して呼び出すことで自身に管理を割り当てたオーナーか、あるいはオブジェクトのリモートプロキシを与えられ、オーナーがAssignControl(BoltConnection connection);を呼び出すことでコントロールを付与した人物である可能性もあります。 実行用のコマンドを整列するために、SimulateControllerのQueueCommandを呼び出すこともできます。

Back To Top

メソッド: BoltEntity.ExecuteCommand(BoltCommand Cmd, Bool ResetState)

この機能はオーナーとコントローラーの両方で動作しますが、それぞれでの動作は異なります。

オーナー上ではオーナーがコントローラーかどうかに関わらず、それぞれのコマンドについて 一度のみ動作します。 コマンドがローカルで作成されたかどうかや、オーナー自身に作成されたかどうか、管理権を与えられたリモート接続により発せられたものかどうかは無関係です。 2番目のパラメータである resetStateは、オーナー上では決してtrueにはなりません。

コントローラー上では、そのコントローラーがオーナーでない場合 ExecuteCommandが少々複雑になります。 移動のローカルな予測と、オーナーからの状態の訂正の両方を扱うことができる必要があります。 前者はフレームごとに起こります。Boltは、オーナーにより実証された状態を持っていた最新のコマンドに渡します。 このコマンドが resetStateにおいて渡されたとき、パラメータはtrueとなります。

実証された最新のコマンドがresetStateにより実行されたら、Boltはまだオーナーから実証されていないその他全てのコマンドを実行します。 つまり、ExecuteCommandはオーナーによって実証されるまで、連続した複数のフレームでリモートのコントローラー上の1つのコマンドに対して 複数回呼び出されます。

Back To Top

'resetState'が伴うもの

resetStateを含むtrueに設定されたコマンドが実行された場合、Boltはキャラクターの動力のローカルの状態の設定をコマンドによって表される状態にしようとします。 ここでは"BoltCommand.Input"ではなく、"BoltCommand.Result"のみを用いて下さい。 これによりBoltは、リモートのコントローラー(多くの場合はクライアント)のローカルの動きを、オーナー(多くの場合はサーバー)からの正しい状態に合わせて修正することができます。

リセットが必要な状態は、何らかの形であなたのエンティティの移動に影響を及ぼす状態全てです。通常、位置や回転、立っているか匍匐前進しているかを示すような状態の変数などがこれに含まれます。また、複雑なコントローラーがある場合には速度や加速度、外力などをリセットする必要もあります。

状態リセットが正しくない、または完全でない場合にはコントローラー側の「ぎくしゃくした動き」の主な原因となります。

Back To Top

BoltCommand.isFirstExecutionの用途

コマンドからの直接的なアクションを行うコードです。例として、武器の発砲やアニメーションの状態設定があります。次のようなブロックに包括されていなくてはなりません:

if (cmd.isFirstExecution) {
  // code ...
}

リモートのコントローラー上では、ExecuteCommandは同一のコマンドのために複数回呼び出されることとなります。このため、アニメーションなどの直接的なアクションが最初の実行時にのみ起こるようにチェックしていない場合、リモートのコントローラー上でのキャラクターの行動は非常に奇妙なものとなってしまいます。

Back To Top

コントローラーでない通常プロキシについて

エンティティの直接的な管理下になく、エンティティのオーナーでもない通常プロキシ上において施行される唯一のコールバックは SimulateProxy() であり、SimulateController()ExecuteCommand() は稼働しません。

位置や回転、アニメーション、状態の同期は、これらのエンティティに対するBoltの状態オブジェクトを通じて行われます。 つまり、あらゆるタイプの状態やアクション、イベントを接続しているすべての人に対して可視化させたい場合、Bolt State Mecanimによって送信するか、Bolt Event上で送信する必要があります。Bolt Commandsはコントローラーかオーナー上のみで実行されるためです。

ドキュメントのトップへ戻る