この記事はアドベントカレンダー「【VCI】テーマパーク を作ろう 」の17日目の記事です。
今回の内容
今回は前回作成した気球のボタンを複数人で扱っても速度が維持されるように変更していきます
今回は学ぶ技術は以下となります。
・Stateによる変数の共有
State概要
前回複数人でボタンをいじったときに速度情報が維持されなかったのは、各自で速度の情報を持っていたためでした。
そのため、全員で1つの速度情報を持ち、それを参照・変更するようにすれば速度情報を維持することができます。
Vキャスには全員で共通の変数を使える「State」という機能があるため、そちらを使用します。詳細は以下の公式ページを御覧ください
・State概要
Stateは以下の3つの関数しかありません。
・Set(name,value):nameという名前でvalueを保存する。
・Get(name):nameという名前で保存されている値を取得する
・Add(name,value):nameという名前で保存されてる値にvalueを加算する
valueには文字列も設定可能ですが、Addが使用できるのは数値で保存されている場合のみです。
コードの作成
Stateを使用してコードを修正すると以下のようになります
スピード変更部分
-- 初期化処理。あとから入ってきた人に上書きされないように、VCIを出した人のみ実行するようにする。
if vci.assets.IsMine then
vci.state.Set("BalloonSpeed",0)
end
function onUse(use)
if use == "Button_Balloon_Up" then
vci.state.Add("BalloonSpeed",1)
end
if use == "Button_Balloon_Down" then
vci.state.Add("BalloonSpeed",-1)
end
end
気球の位置を変える部分
Stateの初期化処理反映前にupdateAllが呼ばれる可能性があり、その場合はvci.state.Getはnilを返します。
そのため、nilのときは処理をしないようにしています。
function updateAll()
local balloon = vci.assets.GetTransform("HotAirBalloon")
--バルーンの所有権を持っていたら
if balloon.IsMine then
local BalloonSpeed = vci.state.Get("BalloonSpeed")
--ちゃんと値が設定されているときのみ実行する。
if BalloonSpeed ~= nil then
local nextPos = balloon.GetPosition()+Vector3.up*BalloonSpeed*0.01
--移動先の座標が地中(y<0)ならy=0にする。(地中に埋まらないようにする処理)
if nextPos.y < 0 then
nextPos.y = 0
BalloonSpeed = 0
end
balloon.SetPosition(nextPos)
end
end
end
以上で作成完了です。
Stateの注意点
Stateは設定後すぐには反映されません。
そのため、以下のように同じフレーム内で設定&参照しても設定された値を取得することはできません。
コード
-- 初期化処理。あとから入ってきた人に上書きされないように、VCIを出した人のみ実行するようにする。
count = 0
function updateAll()
print("設定値:"..count)
vci.state.Set("Count",count )
--ここでGetしてもSetした値が取得できない。
print("参照値:"..vci.state.Get("Count"))
count = count + 1
end
結果(Stateに関係ないものが設定されてますが無視してください)
終わりに
いかがでしたでしょうか?
Stateは便利ですが、値が反映されるまで少しラグがあるため、注意して使いましょう。
次回の内容は未定です。