ネットワーク同期

VCI を作るうえでもっとも重要で難しい要素はネットワーク同期です。 ネットワーク同期とは、ネットワーク越しの複数のバーチャルキャスト上の VCI の状態を一致させることです。 VCI の状態としてはたとえば “マテリアルの色” “表示するテキスト” “再生中のオーディオ名” などが挙げられます。 複雑な VCI であれば、さらに複雑な状態を持つことになるでしょう。

そんな VCI の状態が一致せず、プレイヤーごとに見えるマテリアルの色が異なっていたら体験が損なわれてしまいます。 ここでは簡単のため、 VCI の状態として “マテリアルの色” を例にして、ネットワーク同期について説明します。

Alice と Bob がそれぞれのバーチャルキャストでそれぞれの世界を見ている図

2 人のプレイヤー Alice と Bob がいるルームで、次のスクリプトを持つ VCI を動作させることにしましょう。

main.lua
-- マテリアルの色を白で初期化する
vci.assets.material.SetColor("material", Color.white)
 
function onUse(objectName)
    -- Use したらマテリアルの色を赤に変更する
    vci.assets.material.SetColor("material", Color.red)
end

SubItem を Use するとマテリアルの色を変えるスクリプトですね。

まずはこの VCI を出してみます。

Alice は白色、Bob も白色の VCI を見ている図

すると Alice と Bob どちらから見ても白色です。 これは VCI の状態が一致、つまりネットワーク同期できていると言えます。

では次に Alice が Use したとしましょう。

Alice は手を触れ赤色の VCI を見て笑顔、Bob は白色の VCI を見てクエスチョンマークを掲げる図

するともちろん Alice から見れば赤色になります。 しかし Bob から見れば元の白色のままです。 これは 2 人の VCI の状態が異なっている、つまりネットワーク同期できていないと言えます。 どうしてこうなるのでしょうか?

これを説明するにはまず、VCI のスクリプトがどのように実行されているのかを知る必要があります。

まず VCI のスクリプトはそれぞれのバーチャルキャスト上で独立して、互いを知ることなく実行されます。 Alice や Bob の PC や Quest は遠く離れた別のデバイスですから、当たり前ですよね。

ここで最初の マテリアルの色を白で初期化する 処理について考えてみましょう。 この処理は VCI を出したときに実行するという処理にすぎません。 ネットワーク同期のことなどどこで考えているのでしょうか? 順を追ってみましょう。

  1. Alice が VCI を出します。
  2. Alice と Bob それぞれのバーチャルキャストで独立してスクリプトが実行されます。
  3. スクリプトの内容は同じなので、同じ処理がそれぞれ実行されます。
  4. 実行内容はどちらも マテリアルの色を白で初期化する なので、それぞれ白色になります。

したがって独立しているが、たまたま同じ処理が実行されるため、結果としてどちらも白色になるわけです。 このような処理でも、意図して記述しているならネットワーク同期できていると言えます。

しかし Use したらマテリアルの色を赤に変更する 処理はネットワーク同期できていませんでした。 次はこの処理について考えてみましょう。