VCIスクリプトだけでSubitemの親子関係を再現する

SubItemの子にSubItemを設定する事はできないので、SubItemで親子関係を作る場合、工夫が必要になります。
その一例として、スクリプトを使って親子関係の動きを作るSampleを作成します。

サンプルデータ

parentandchild.zip

コンポーネント設定

基本的に、subitem、collider、rigidbodyのコンポーネントがあれば大丈夫ですが、
スクリプトでVCIを動かす場合、グループIDに注意する必要があります。

所有権を持たないSubItemはスクリプトで動かしても動きが反映されません。
所有権を持ってるクライアントで実行された動きが他のクライアントに反映されます。

updateALLで実行すれば大丈夫なのですが、念のため親オブジェクトをつかんだ時点で子オブジェクトの所有権が必要なので、親と子のIDを0以外で同じ値にします。

VCIスクリプト

親の現在地の座標とは、子の原点(0,0,0)になります。
なので、親の現在地(子の原点)から、親と子の相対距離を加えてやる事によって、位置の親子関係は成り立ちます。

ただし、相対距離を定数にしてしまった場合、親の姿勢によって子の位置が変化しないので工夫が必要です。
例えば、親よりY=0.5上の位置に子を置きたい場合は以下のように書きます。
_Parent.GetRotation() * Vector3.__new(0, 0.5, 0)
このように、親オブジェクトの姿勢であるRotationをVector3に掛ける事で、親オブジェクトの姿勢に対するVector3に変換する事ができます。

後は、親の姿勢と子の姿勢が同じようになればいいので、親の姿勢を変数に代入して、SetRotation()で子の姿勢にしてやれば、スクリプトによって親子関係を作成する事ができます。

子の位置を調整する場合は、offsetに代入するVector3の値を変更する事で調整する事ができます。

main.lua
-- 親となるオブジェクト
local _Parent = vci.assets.GetTransform("Parent")
-- 子となるオブジェクト
local _Child = vci.assets.GetTransform("Child")
 
function updateAll()
 
    -- posに親オブジェクトの現在地を代入する
    local pos = _Parent.GetPosition()
 
    -- offsetに親の姿勢を使って回転させた Y+0.5 の座標を代入する
    -- Vector3.__new(0, 0.5, 0) の値を変更すると、子オブジェクトの位置を変更できます
    local offset = _Parent.GetRotation() * Vector3.__new(0, 0.5, 0)
 
    -- 親オブジェクトの位置+offsetしたい座標を加えて、子のポジションとする
    pos = pos + offset
    _Child.SetPosition(pos)
 
    -- rotに親の姿勢を代入し、子の姿勢とする
    local rot = _Parent.GetRotation()
    _Child.SetRotation(rot)
 
end