オーナー
アイテムは様々な動作を行います。
- Grabされて移動する
- 物理演算で移動する
- トリガー・ギミック
- ClusterScript
これらは全て、プレイヤーからの入力を受け取り、それに基づいて処理を行い、 その結果をプレイヤー全員に表示する、という形で実現されています。
アイテムの分散実行
空間やアイテムは、プレイヤーのデバイスとサーバーで分散実行されています。 そのため、どこかのタイミングでデータを別のデバイスやサーバーにネットワーク越しに送信する必要があります。
たとえばクリックしたら色が変わるアイテムがあるとします。
$.onClick(() => $.material("main").setBaseColor(...));
これをプレイヤーAが操作した場合、次のようにデータが流れます。
- 入力: プレイヤーAが自身のデバイスでクリック
- 誰がクリックするかは分からないため、全デバイスでクリックを待ち構える必要があります
$.onClick
やトリガーコンポーネントは全デバイスで実行され、デバイスでのクリックを空間内で扱える形に変換します
- 処理: クリックされたら色を変える処理 (
$.material("main").setBaseColor(...)
の部分)- これは単一のデバイスで実行されます
- 表示: 実際に全プレイヤーの画面でそのアイテムの色を変えた状態で表示
setBaseColor
等は、内部的なアイテムの属性値を変更します- この属性値がネットワーク経由でサーバーを介し全デバイスに送信され、各デバイスがUnityのGameObjectのプロパティを変更します
このとき、入力は操作者のデバイスで行われ、表示は全員のデバイスで行われますが、処理をどこで行うかには複数の可能性があります。 clusterでは基本的に単一のデバイスが常に処理を行う役を担い、これをオーナーと呼びます。 このケースでは、このアイテムのオーナーはプレイヤーA(のデバイス)である、といいます。
このように処理をオーナーが担うことで、物理演算や乱数などを利用しても結果がプレイヤー毎に乖離していくことなく最終的には正常に同期されます。
投機的実行
基本的には、各アイテムについてある時点では唯一のオーナーが存在し、オーナーだけが処理を実行します。 しかし、プレイヤーがアイテムとインタラクトすることでオーナーが変化する場合には特殊な処理が行われます。
プレイヤーがアイテムとインタラクトすると、オーナーが完全に移行する前にインタラクトしたプレイヤーのデバイスにおいて、 「オーナーが移行したと見なして」処理が実行されます。これを投機的実行と呼びます。
ほとんどの場合、オーナーが瞬時に移行したと見なして問題はありませんが、元のオーナーが同時にネットワークから切断された場合などに、 一時的に処理が巻き戻るように見える場合があります。
生成アイテムのオーナー
ワールド生成アイテムや動的に生成されたクラフトアイテムの初期のオーナーは、 生成を行ったアイテムのオーナーと同一になります。