~~NOTOC~~ ====== ExportState(アイテム内同期変数) ====== このページは過去の情報となります。\\ 新しいスクリプトリファレンスは**[[https://developer.virtualcast.jp/vci-docs/api/|こちら]]**になります。 アイテム内同期変数((実装当初は「状態変数」と呼ばれておりましたが、命名が見直されて「アイテム内同期変数」となりました。これは「[[vci/script/reference/exportshared|グローバル同期変数]]」と並ぶ「[[vci/script/reference/syncvariable|同期変数]]」の一つであることを明示するためです。)) 。特定のアイテムに紐づく変数を持たせる機能です。 [[vci/script/reference/exportstate| vci.state]] で共有出来るデータ量は最大''16KB''までとなります。 * 変数は全ユーザーで同期されます。 * 変数はアイテムを呼び出したときには空の状態になります。\\ (VCIを消してもう一度出現させた場合、変数は初期化されます) * 空間の種類によっては、アイテムが出された空間から全員退出した際に変数がリセットされることがあります。 * ルームの場合: リセットされない * スタジオの場合: リセットされる ^ 名前 ^ 説明 ^ バージョン ^ | [[vci/script/reference/exportstate#Set]] | Stateに値を設定 | | | [[vci/script/reference/exportstate#Get]] | Stateの値を取得 | | | [[vci/script/reference/exportstate#Add(非推奨)]] | Stateに値を加算 | | | [[vci/script/reference/exportstate#GetHashCode]] | ハッシュ値を取得 | | | [[vci/script/reference/exportstate#ToString]] | 文字列に変換 | | === サンプル === if vci.assets.IsMine then -- 呼び出したユーザーが代表して初期化する vci.state.Set('switch', 0) end function updateAll() -- 所有権に関係なく全ユーザーに来る --print(vci.state.Get('switch')) if vci.state.Get('switch')==1 then vci.assets.SetMaterialColorFromIndex(4, Color.__new(1, 0, 0, 1)) else vci.assets.SetMaterialColorFromIndex(4, Color.__new(0.5, 0.5, 0.5, 1)) end end function onUse(use) print('use') vci.state.Set('switch', 1) end function onUnuse(use) print('unuse') vci.state.Set('switch', 0) end ===== Set ===== **Set fun(name: string, value: usertype):** 値をセットすることを**要求**します。(Setできるまでラグがあります)\\ セットできる型は下記になります * nil * boolean * number * string * table === Setのラグについて === ''vci.state.Set("value", 1)'' を実行したフレームは、あくまでサーバーに送信する予約のようなもので、\\ 実際に反映されるには少なくとも、Setを実行したフレームを終了する必要があります。\\ グローバル同期変数はサーバー側に保存されるため、通信のラグを見越した処理が必要です。 === サンプル === vci.state.Set('value', 1) -- 値のセットを要求(まだ反映されていない)。 -- delay local delay = 0 while delay < 1000 do delay = delay + 1 end local value = vci.state.Get("value") -- delayしてもSetしたフレームは終了してないのでnil print(tostring(value)) function update() local value = vci.state.Get("value") -- updateの1フレーム目はnil end function onUse(use) local value = vci.state.Get("value") -- VCI取り出し後、時間が経過している場合は1がGetできる print(tostring(value)) end ===== Get ===== **Get fun(name: string): usertype** === サンプル === local value = vci.state.Get('value' ) ===== Add(非推奨) ===== **Add fun(name: string, value: usertype):** === サンプル === 複数ユーザーが同時に値を変更する場、Getした値に加算した値 をセットするとうまくいかない場合があります。 vci.state.Set('value', vci.state.Get() + 1) -- Getした値に加算する 上記のスクリプトを2人以上のユーザーが同時に実行した場合にひとつしか値が増えません。 (最後のひとつで上書きされて、他の値が打ち消されてしまう) Addを使うことでこの状況に対応できます。 vci.state.Add('value', 1) -- 値を加算する命令 上記のスクリプトを2人以上のユーザーが同時に実行した場合に実行回数分加算できます。 ===== GetHashCode ===== **GetHashCode fun(): number** ハッシュ値を求めます。 ===== ToString ===== **ToString fun(): string** 文字列に変換します。