0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

17日目:気球で学ぶState(マルチ環境での変数同期)

Last updated at Posted at 2020-12-22

この記事はアドベントカレンダー「【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に関係ないものが設定されてますが無視してください)
2020122201391286.jpg

終わりに

いかがでしたでしょうか?
Stateは便利ですが、値が反映されるまで少しラグがあるため、注意して使いましょう。
次回の内容は未定です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?