~~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**
文字列に変換します。