~~NOTOC~~ ====== ExportShared(グローバル同期変数) ====== このページは過去の情報となります。\\ 新しいスクリプトリファレンスは**[[https://developer.virtualcast.jp/vci-docs/api/|こちら]]**になります。 グローバル同期変数((実装当初は「共有変数」と呼ばれておりましたが、命名が見直されて「グローバル同期変数」となりました。これは「[[vci/script/reference/exportstate|アイテム内同期変数]]」と並ぶ「[[vci/script/reference/syncvariable|同期変数]]」の一つであることを明示するためです。)) 。\\ 特定のアイテムに結び付かずに、部屋に変数を保存する機能です。 ^ 名前 ^ 説明 ^ バージョン ^ | [[vci/script/reference/exportshared#Set]] | Stateに値を設定 | | | [[vci/script/reference/exportshared#Get]] | Stateの値を取得 | | | [[vci/script/reference/exportshared#Add(非推奨)]] | Stateに値を加算 | | | [[vci/script/reference/exportshared#Bind]] | ユーザー名を取得 | | | [[vci/script/reference/exportshared#GetHashCode]] | ハッシュ値を取得 | | | [[vci/script/reference/exportshared#ToString]] | 文字列に変換 | | ===== Set ===== **Set fun(name: string, value: usertype)** Stateに値を設定します。 === サンプル === if vci.assets.IsMine then -- 呼び出したユーザーが代表して初期化する vci.studio.shared.Set('switch', 0) end function onUse(use) print('use') vci.studio.shared.Set('switch', 1) end function onUnuse(use) print('unuse') vci.studio.shared.Set('switch', 0) end ===== Get ===== **Get fun(name: string)** Stateの値を取得します。 ===== Add(非推奨) ===== **Add fun(name: string, value: usertype)** Stateに値を加算します。 [[vci/script/reference/exportstate#Add|ExportState.Add]]を参照してください。 ===== グローバル同期変数の弱点と代替策 ===== グローバル同期変数には実装上の弱点があります。 * アイテム間での変数名重複を回避する手段が無い * 変数の持ち主が分からないのでクリアできない ==== vci.studio.shared.Get を vci.state + message で代替する例 ==== === グローバル同期変数の場合 === local value = vci.studio.shared.Get('valueName') === 代替する場合 === == 値をGetする方 == -- あらかじめ値を受け取る関数を用意して message.On('response_valueName', function() end) -- 値を要求 message.Emit('request_valueName') == 値をGetされる方 == -- 値が要求されたら message.On('request_valueName', function() -- アイテム内同期変数から値を得て投げ返す vci.Emit('respone_valueName', vci.state.Get('valueName')) end) ちょっと大変です。 ===== Bind ===== **Bind fun(name: string, callback: usertype)** 同期変数の値が変更されたときに実行されます。\\ 初期に updateAll が無かったために実装されました。 === サンプル === Bind は updateAll と似ていますが、ちょっと違います。 -- Bind。値が変更されたタイミングだけ呼ばれる vci.studio.shared.Bind('switch', function(value) if value==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) -- updateAll。値が変更されなくても毎フレーム呼ばれる function updateAll() -- 所有権に関係なく全ユーザーに来る --print(vci.state.Get('switch')) if vci.studio.shared.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 ===== GetHashCode ===== **GetHashCode fun(): number** ハッシュ値を求めます。 ===== ToString ===== **ToString fun(): string** 文字列に変換します。