====== ネットワーク同期 ======
VCI を作るうえでもっとも重要で難しい要素は**ネットワーク同期**です。
ネットワーク同期とは、ネットワーク越しの複数のバーチャルキャスト上の **VCI の状態を一致させること**です。
VCI の状態としてはたとえば "マテリアルの色" "表示するテキスト" "再生中のオーディオ名" などが挙げられます。
複雑な VCI であれば、さらに複雑な状態を持つことになるでしょう。
そんな VCI の状態が一致せず、プレイヤーごとに見えるマテリアルの色が異なっていたら体験が損なわれてしまいます。
ここでは簡単のため、 VCI の状態として "マテリアルの色" を例にして、ネットワーク同期について説明します。
Alice と Bob がそれぞれのバーチャルキャストでそれぞれの世界を見ている図
2 人のプレイヤー Alice と Bob がいるルームで、次のスクリプトを持つ VCI を動作させることにしましょう。
-- マテリアルの色を白で初期化する
vci.assets.material.SetColor("material", Color.white)
function onUse(objectName)
-- Use したらマテリアルの色を赤に変更する
vci.assets.material.SetColor("material", Color.red)
end
SubItem を Use すると[[https://developer.virtualcast.jp/vci-docs/api/classes/ExportMaterial/SetColor.html|マテリアルの色を変える]]スクリプトですね。
まずはこの VCI を出してみます。
Alice は白色、Bob も白色の VCI を見ている図
すると **Alice と Bob どちらから見ても白色**です。
これは VCI の状態が一致、つまり**ネットワーク同期できている**と言えます。
では次に Alice が Use したとしましょう。
Alice は手を触れ赤色の VCI を見て笑顔、Bob は白色の VCI を見てクエスチョンマークを掲げる図
するともちろん **Alice から見れば赤色**になります。
しかし **Bob から見れば元の白色のまま**です。
これは 2 人の VCI の状態が異なっている、つまり**ネットワーク同期できていない**と言えます。
どうしてこうなるのでしょうか?
これを説明するにはまず、VCI のスクリプトがどのように実行されているのかを知る必要があります。
まず VCI のスクリプトはそれぞれのバーチャルキャスト上で独立して、互いを知ることなく実行されます。
Alice や Bob の PC や Quest は遠く離れた別のデバイスですから、当たり前ですよね。
ここで最初の ''マテリアルの色を白で初期化する'' 処理について考えてみましょう。
この処理は VCI を出したときに実行するという処理にすぎません。
ネットワーク同期のことなどどこで考えているのでしょうか?
順を追ってみましょう。
- Alice が VCI を出します。
- Alice と Bob それぞれのバーチャルキャストで独立してスクリプトが実行されます。
- スクリプトの内容は同じなので、同じ処理がそれぞれ実行されます。
- 実行内容はどちらも ''マテリアルの色を白で初期化する'' なので、それぞれ白色になります。
したがって**独立しているが、たまたま同じ処理が実行されるため、結果としてどちらも白色になる**わけです。
このような処理でも、意図して記述しているなら**ネットワーク同期できている**と言えます。
しかし ''Use したらマテリアルの色を赤に変更する'' 処理はネットワーク同期できていませんでした。
次はこの処理について考えてみましょう。