この記事はアドベントカレンダー「【VCI】テーマパーク を作ろう 」の12日目の記事です。
今回の内容
今回はチュロスを作りながらオブジェクトの生成と削除について学んで行きます。
~~2日 ~~3日に分けての説明となります。今回は以下の内容を学びます。
・VCIにおける生成と削除の概念
・オブジェクトの生成方法
VCIにおける生成と削除
Vキャスでは純粋な意味でオブジェクトの生成や削除をコードから行うことはできません。そのため、生成・削除しようとするタイミングで変わりに表示・非表示する処理を行うことで擬似的に再現しています。
非表示にする方法は「透明にする」・「サイズを0にする」・「見えないくらい遠くに置く」などがあります。
今回は「見えないくらい遠くに置く」の方法で作成していきます。
具体的には以下のルールで作成します
・非表示のオブジェクトはy座標が-500の場所に置いておく。
・y座標が-100以上の場合は出現状態、-100以下の場合は非表示の状態として扱う。
(境界値が-100であることに深い意味はないです。0~-500ならどこでもいいと思います)
・ボタンを押すと非表示状態のチュロスを出現させる。全て出現状態の場合はコンソールにメッセージを出す。
・チュロスを食べたら手元から消えて非表示の状態に戻る。(こちらは明日作成分)
Unityでの設定
まずは出現対象となるチュロスを作り複製します。今回は6個としました。
(チュロスは持ち運べるようにしたいためSubItmeコンポーネント付きで作成します。)
これらのチュロスは最初は非表示の状態としたいため、y座標を-500に設定します。
次にチュロスを出現させるためのボタンと出現ポイントの設定をします。
出現ポイントは以下の画像のように出現させたい場所に空オブジェクトを置くことで実現しています。
(出現位置をコードで計算して決めることも可能ですが、こちらの方が直感的にわかりやすいと思います。)
Unityの設定は以上です。
コード作成
ここからはVキャス及びエディタでの作業となります。
※今回のコードだけでは複数人で扱った場合、正しく動作しません。
次の記事に対策方法を書く予定ですので合わせてお読み下さい。
チュロスを出現させる際は出現中のチュロスはではなく、非表示状態のものを取ってくる必要があります。
そのため、まずはチュロスの座標をチェックして出現対象となるチュロスを探してくる関数を作成します。
対象となるチュロスがない(全て出現された状態)の場合はnil(空)を返すようにします。
--出現対象とするチュロスを探す。
function fetchChurros()
--出現対象となるチュロス。はじめはnilを入れておく。
local targetChurros = nil
-- チュロスオブジェクトが取得できなくなるまでずっとループ
local no = 1
while(true) do
--チュロスオブジェクト取得
local churros = vci.assets.GetTransform("Churros_"..no)
if churros then
--取得したオブジェクトのY座標が-100以下ならそれをターゲットに定めループを抜ける。
if churros.GetPosition().y < -100 then
targetChurros = churros
break
end
else
--オブジェクトが取得できなくなったらループを抜ける
break
end
no = no + 1
end
--取得したチュロスを返す。なければnilの状態のままなのでnilが返る。
return targetChurros
end
次にボタンを押した際に上記関数を呼び出し、対象となるチュロスを出現させる処理を作成します。
---[SubItemの所有権&Use状態]アイテムをグラッブしてグリップボタンを押すと呼ばれる。
---@param use string @押されたアイテムのSubItem名
function onUse(use)
--今回作成したボタン「Button_Appear_Churros」が押されたときのみ実行される
if use == "Button_Appear_Churros" then
local churros = fetchChurros()
if churros then
--対象のオブジェクトを出現ポイントの位置に移動させる
local appearPoint = vci.assets.GetTransform("Churros_AppearPoint")
churros.SetPosition(appearPoint.GetPosition())
churros.SetRotation(appearPoint.GetRotation())
else
--対象となるチュロスがなかった場合
print("チュロスは完売しました。")
end
end
end
以上でコード作成は完了です。
以下の画像のように、チュロスがある場合はチュロスが出現し、ない場合はコンソールにメッセージが出るようになりました。
(分かりづらいですがcubeのボタンを何回か押しています)
終わりに
いかがでしたでしょうか?
今回作成したコードではまだマルチ未対応の不完全状態ですので、明日は今回のコードの問題点・解決策の説明およびオブジェクトの消失の処理について学んでいきます。