SetVelocityなどを使用した、アイテムの位置や回転、ベクトルをリセットするサンプルです。
アイテムを使ったときに処理を実行するには「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に以下スクリプトを記入します。
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