1
1

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 5 years have passed since last update.

おまえは今まで食ったパンの枚数をおぼえているのか?(local変数とState)

Last updated at Posted at 2019-12-23

#はじめに
この記事は、VCI Advent Calendar 2019の23日目の記事です。
VCIにおけるlocalの変数及びSTATEに関する初歩的な内容の記事となってます。
そのため、それ以外の部分の説明は省略しています。
(最終的に「今までに」の部分を満たしていないため若干タイトル詐欺入ってます。)

#おまえは今までに食ったパンの枚数をおぼえているのか?
この言葉は誰しも一度は耳にした事がある言葉だと思います。
しかしあなたはこの言葉をかけられた時、すぐに答えることができるでしょうか?

答えることが出来なければただただ歯を食いしばって怒りを「グ・・・」とこらえることしかできなくなります。
そんな思いをしなくてもいいようにVCIを使って食べたパンの枚数を覚える手順を紹介します。

おまえは今までに食ったパンの枚数をおぼえていない(level 1)

まずはベースとなる状態です。
level1.gif
見た分かる通り、ただただパンを食べているだけの状態です。
自分が何枚食べたかは全く把握できていません。
ここからちゃんとパン管理できるようにLevelを上げていきましょう

おまえは今までに食ったパンの枚数をおぼえている(level 2)

食べた枚数を覚えるために、以下のように食べた枚数をカウントする処理を追加します。

--"Slice N":8枚切りのパンの名前。Nは1~8のいずれか
local count = 0
function onCollisionEnter(item, hit)
  if string.find( item , "Slice" ) and hit == "Counter" then --口元にある見えないオブジェクトにあたったらカウント
    count = count + 1
    vci.assets._ALL_SetText("CounterText", count)
    ---[パンを非表示にする処理(省略)]---
end

countという変数で食べた枚数を記憶しておき、CounterTextというで食べた枚数を表示しています。

level2.gif
このように今まで食べたパンの枚数を覚えることが出来ました。

おまえはあいつが今までに食ったパンの枚数もおぼえている(level 3)

level2でローカル変数を使い、自分の食べた枚数を数えることは出来ました。
しかし、実際には止む終えぬ事情で首だけになり、他人の体を乗っ取ることがあるかと思います。
その場合は体が入れ替わるため、今まで相手が食べた枚数を引き継いで覚えていかなければいけません。

ですが、level2の状態では以下のように体(カウンター)を乗っ取っても値を引き継ぐくことは出来ません。
level3-0.gif
これはcountの値を各ユーザーばらばらで持っており、
相手が食べた枚数を自分が食べた枚数で上書きしてしまうためです。
(上記の例だと左の赤い子は11枚食べていたためcountが11ですが、右の赤い子は1枚も食べておらずcountが0の状態のため、0+1で表示が1となります)

これを解決するために、他の人と変数を共通で持てるstateという機能を機能を使用します。
stateではSetで値の設定、Getで値の取得をすることが出来ます。
上記機能を使って、変数を共有できるようにしたコードが以下です。


if vci.assets.IsMine then
  vci.state.Set("eatCount",0)
end

--"Slice N":8枚切りのパンの名前。Nは1~8のいずれか
local count = 0
function onCollisionEnter(item, hit)
  if string.find( item , "Slice" ) and hit == "Counter" then
    local count = vci.state.Get("eatCount") + 1
    vci.state.Set("eatCount",count)
    vci.assets._ALL_SetText("CounterText 1", count)
    ---[パンを非表示にする処理(省略)]---
  end
end

(注意点として、「vci.state.Set("eatCount",0)」の部分はvci.assets.IsMineをつかって自分だけ動くようにする必要があります
そうしないと凸者が来るたびに初期化スクリプトが走り、値が0に戻ってしまいます。)

このコードにより無事に今までに食べたパンの枚数を引き継ぐことが出来ました
level3.gif

#いかがでしたか?
今回はVCIにおけるローカル変数とstateの差をパンを数えながら紹介しました。
実際には今回紹介した方法ではVCIを出してから削除するまでの枚数しか数えられていないため、厳密には「今までに」食ったパンの枚数は覚えていない状態です。(タイトル詐欺)
いずれVCIで変数などを保存する方法が追加されたら、「今までに」食ったパンの枚数も数えられるときが来るでしょう。
その時はみんなでパンの枚数を覚えて行きましょう!
Let's enjoy Remember pan!٩( 'ω' )و

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?