目次

アイテムを使ったときに位置や回転をリセットする

SetVelocityなどを使用した、アイテムの位置や回転、ベクトルをリセットするサンプルです。

サンプルデータ

https://virtualcast.jp/products/d49d7c585f3b26547f6a38dc727a77e3c28ecc45f881a20ecb1271eb6757988f

resetsample_vci.zip

手順

アイテムを使ったときに処理を実行するには「onUse」を使用します。

ここでは「VCI Object」に、移動できる「VCI SubItem」が複数ある場合、
指定の「VCI SubItem」を使うと初期位置へ戻る処理を作成します。
サンプルは平たいボックスの上に球が陳列しており、
ボックスをつかんで移動させてもアイテムを使用すると、
球が元の位置に戻るようになっています。

1. 新しくGameObjectを作成し、その中にCubeを1個、Sphereを5個入れ子にします。
(作例ではSphereが5個ですが、いくつでも構いません)

GameObjectの名前は「ResetSample_VCI」としていますが、任意の名前でも可です。
Cubeの名前は「Cube」と指定し、Sphereの名前は「Ball1からBall5」と指定します。
Cubeは地面に貫通しないようY座標を1.0に指定し、Sphereは更に1.5に指定します。
またCubeのスケールを平たくし、SphereのスケールはCubeの上に収まるように調整します。

2. GameObjectに「VCI Object」コンポーネントをアタッチし、
CubeとSphereに「VCI SubItem」コンポーネントをアタッチします。
この時、「Rigitbody」コンポーネントもアタッチされます。
Cubeは重力を使用しないため、「Rididbody」の「Use Gravity」をOFF、「Is Kinematic」をONにし、
なおかつつかんで移動できるようにするため「VCI SubItem」の「Grabbable」をONにします。
Sphereはアタッチ後のパラメータそのままにします。

3. 更にどのユーザーがアイテムを使用しても、きちんと位置が初期位置へ戻るように、
「VCI SubItem」の「GroupId」を1に変更します。
こうすることで「GroupId」が1のSubItemを一括で制御することができるようになります。

※詳しくは「VCIコンポーネントの詳細/GroupID」を参照してください。

4. GameObjectの「VCI Object」コンポーネントのScriptsのSizeを1に指定し、
Nameに「main.lua」を記入、Sourceに以下スクリプトを記入します。

VCIスクリプト

main.lua
local Cube = vci.assets.GetTransform("Cube")
local Balls = {...}
local Balloffsets = {...}
for i=1,5 do
    Balls[i] = vci.assets.GetTransform("Ball"..tostring(i))
    Balloffsets[i] = Balls[i].GetLocalPosition()
end
 
function onUse(use)
    if use == "Cube" then
        local Cube_localPos = Cube.GetLocalPosition()
        local Cube_localRot = Cube.GetLocalRotation()
        local rotationAngles = Cube_localRot.eulerAngles
        --玉の修正
        for i=1,5 do
            local relativeDirection = Balloffsets[i]
            local goalPosition = Quaternion.Euler(0, rotationAngles.y, 0) * relativeDirection
            Balls[i].SetLocalPosition( goalPosition + Cube_localPos )
            Balls[i].SetVelocity(Vector3.zero)--rigitbodyにかかる速度をゼロに
            Balls[i].SetAngularVelocity(Vector3.zero)--rigitbodyにかかる回転をゼロに
        end
    end
end