17일차: 풍선에서 학습한 State(다중 환경의 변수 동기화)

이 글은 어드벤트 달력'[VCD] 테마파크 만들어.의 17일째 글이다.

이번 내용


저번에 만든 풍선 버튼이 이번에 변경되어 여러 사람이 사용해도 속도가 유지됩니다.
이번에 배운 기술은 다음과 같다.
• State를 통한 변수 공유

State 요약


지난번에 몇 사람이 버튼을 눌렀을 때 속도 정보가 유지되지 않은 것은 각자 속도 정보가 있기 때문이다.
따라서 전체 인원이 속도 정보를 가지고 그것을 참조, 변경하면 속도 정보를 유지할 수 있다.
V 캐스트는 전원 공동으로 변수를 사용하는'스테이트'기능이 있기 때문에 그것을 사용한다.자세한 내용은 아래 공식 페이지를 보십시오
State 요약
State에는 다음 세 가지 함수만 있습니다.
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의 초기화 처리가 반영되기 전에 업데이트 All이라고 할 수 있습니다. 이 경우 vci입니다.state.Get이 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는 편리하지만 수치를 반영하기 전에 약간의 지연이 있을 수 있으니 주의해서 사용하세요.
다음 내용은 미정이다.

좋은 웹페이지 즐겨찾기