====== アイテムを使ったときに位置や回転をリセットする ====== [[https://developer.virtualcast.jp/vci-docs/api/classes/ExportTransform/SetVelocity.html|SetVelocity]]などを使用した、アイテムの位置や回転、ベクトルをリセットするサンプルです。 === サンプルデータ === https://virtualcast.jp/products/d49d7c585f3b26547f6a38dc727a77e3c28ecc45f881a20ecb1271eb6757988f {{ :vci:sample:onuse: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の上に収まるように調整します。\\ {{:モデル作成:vci作成:onuse_1_1.png?400|}} 2. GameObjectに「**VCI Object**」コンポーネントをアタッチし、\\ CubeとSphereに「**VCI SubItem**」コンポーネントをアタッチします。\\ この時、「Rigitbody」コンポーネントもアタッチされます。\\ Cubeは重力を使用しないため、**「Rididbody」の「Use Gravity」をOFF、「Is Kinematic」をON**にし、\\ なおかつつかんで移動できるようにするため**「VCI SubItem」の「Grabbable」をON**にします。\\ Sphereはアタッチ後のパラメータそのままにします。 {{:モデル作成:vci作成:onuse_1_2.png?800|}} 3. 更にどのユーザーがアイテムを使用しても、きちんと位置が初期位置へ戻るように、\\ 「VCI SubItem」の「GroupId」を**1**に変更します。\\ こうすることで**「GroupId」が1のSubItemを一括で制御することができる**ようになります。 ※詳しくは「[[vci:component:sdk:subitem|VCIコンポーネントの詳細/GroupID]]」を参照してください。 {{:モデル作成:vci作成:onuse_1_3.png?400|}} 4. GameObjectの「VCI Object」コンポーネントのScriptsのSizeを**1**に指定し、\\ Nameに「main.lua」を記入、Sourceに以下スクリプトを記入します。 ===== VCIスクリプト ===== 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