アイテムを消したり出したりする(scaleの変更)

SetLocalScaleを利用した、SwitchのSubitemをUseした時に、Targetが消えたり出たりするサンプルです。
実際にオブジェクトが消えてるわけではなく、縮小する事で消えてるように見せています。

注意点として、縮小するだけではその場に極小のオブジェクトが残ります。
メッシュを完全に見えなくするには、透明のマテリアルに変更したり、縮小と同時に地下や接触不可な場所に位置変更する等といった方法があります。

サンプルデータ

subitemhyde.zip

コンポーネント設定

基本的にGrabできるSubitemを2つ作ればOKですが、以下ポイントになります。

GroupIDを0以外の値で揃える
transformを変更する際は、所有権が移った状態で行うのがよいです。
GroupIDの仕組みについては を参考にしてください。

ColliderのIsTriggerを有効にする
物理的な接触を行わなくなるので、扱いやすくなります。

rigidbodyのUseGravityを無効にし、IsKinematic有効にする
自由落下がなくなり、空中に固定されるので扱いやすくなります。

VCIスクリプト

local _Target = vci.assets.GetTransform(“Target”)
Targetという名前のSubitemを検索し、Subitemの情報を _Target という変数に格納します。
Targetのsubitemの情報は_Targetにアクセスする事で知る事ができます。

_Target.GetLocalScale().x
Targetのx方向の大きさにアクセスする事ができます。
縮小時(非表示)はこの値が0.001になり、拡大時(表示)はこの値が1になります。
なので、この値を比較する事によって、現在拡大されているか、縮小されているかを知る事ができます。

local scale = Vector3.__new(1, 1, 1)
_Target.SetLocalScale(scale)
アイテムの大きさはX方向、Y方向、Z方向の3つの値(ベクトル3)を使用します。
Vector3._new() で変更したい大きさを作成し_Target.SetLocalScale()で適用します。

実際にアイテムは消滅するわけではないですが、縮小する事によって消えてるように見えます。
問題点としては、接触の判定自体はなくならないという点と、scaleの値が表示・非表示でしか使えなくなるという点です。
その他に、ポジションを遠くに動かして消してるおうに見せる方法もあります。
作りたい物によって、scaleを変更するか、positionを変更するか使い分ける事になるでしょう。

main.lua
-- Target を検索して _Target に格納する
local _Target = vci.assets.GetTransform("Target")
 
function onUse(use)
    -- Useしたアイテムの名前が Switch だった時
    if use == "Switch" then
 
        -- 小さくなってる場合は大きくする
        if _Target.GetLocalScale().x < 0.1 then
            local scale = Vector3.__new(1, 1, 1)
            _Target.SetLocalScale(scale)
        end
 
        -- 大きくなってる場合は小さくする
        if _Target.GetLocalScale().x > 0.1 then
            local scale = Vector3.__new(0.001, 0.001, 0.001)
            _Target.SetLocalScale(scale)
        end
 
    end
end