ExportShared(グローバル同期変数)

このページは過去の情報となります。
新しいスクリプトリファレンスはこちらになります。

グローバル同期変数1)
特定のアイテムに結び付かずに、部屋に変数を保存する機能です。

名前 説明 バージョン
Set Stateに値を設定
Get Stateの値を取得
Add(非推奨) Stateに値を加算
Bind ユーザー名を取得
GetHashCode ハッシュ値を取得
ToString 文字列に変換

Set

Set fun(name: string, value: usertype)

Stateに値を設定します。

サンプル

main.lua
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に値を加算します。

ExportState.Addを参照してください。

グローバル同期変数の弱点と代替策

グローバル同期変数には実装上の弱点があります。

vci.studio.shared.Get を vci.state + message で代替する例

グローバル同期変数の場合

main.lua
local value = vci.studio.shared.Get('valueName')

代替する場合

値をGetする方
main.lua
-- あらかじめ値を受け取る関数を用意して
message.On('response_valueName', function()
 
end)
-- 値を要求
message.Emit('request_valueName')
値をGetされる方
main.lua
-- 値が要求されたら
message.On('request_valueName', function() 
    -- アイテム内同期変数から値を得て投げ返す
    vci.Emit('respone_valueName', vci.state.Get('valueName'))
end)

ちょっと大変です。

Bind

Bind fun(name: string, callback: usertype)

同期変数の値が変更されたときに実行されます。
初期に updateAll が無かったために実装されました。

サンプル

Bind は updateAll と似ていますが、ちょっと違います。

main.lua
-- 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)
main.lua
-- 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

文字列に変換します。

1)
実装当初は「共有変数」と呼ばれておりましたが、命名が見直されて「グローバル同期変数」となりました。これは「アイテム内同期変数」と並ぶ「同期変数」の一つであることを明示するためです。