Unityでの親子化と座標

Unityの座標はInspectorでTransformコンポーネントで表示されているから簡単に見ることができます。

この値はローカル座標になっています。

親の座標系においての座標です。

 

親子化前の2つのオブジェクトです。

f:id:hildsoft:20161221231049p:plain

立方体(Cube)の座標が(1,1,1)

球(Sphere)の座標が(-2,1.5,2)

になっています。

 

これは、両方ともHierarchyのルート階層にあるため、ワールド座標の値と一致します。

 

 

これを親子化してみましょう。

f:id:hildsoft:20161221231050p:plain

 

 

親子化後の2つのオブジェクトです。

f:id:hildsoft:20161221231051p:plain

立方体(Cube)の座標は(1,1,1)で変わらず、

球(Sphere)の座標は(-3,0.5,1)になっています。

 

球の座標表示は変わっていますが、実際のオブジェクトの位置関係からワールド座標は変わってないことが分かります。

 

球(Sphere)の座標(-3,0.5,1)は何を意味するのかというと、立方体(Cube)を中心としたときの座標系でのローカル座標です。

 

この辺はベクトルをイメージすると分かりやすいと思います。

 

スクリプトで親子化するときは

① 子オブジェクト.transform.parent = 親オブジェクト.transform;

② 子オブジェクト.transform.SetParent(親オブジェクト.transform, true);

③ 子オブジェクト.transform.SetParent(親オブジェクト.transform, false);

の3つ方法があります。

 

SetParentのマニュアルはこちら

Unity - スクリプトリファレンス: Transform.SetParent

 

 

①と②はHierarchyで操作する方法と同じで、ワールド座標の変更はありません。

③の場合は、ローカル座標の分だけスライドして親子関係を構築します。

(SetParentの引数を省略したときは②と同じです)

 

上の立方体と球の例だと、球の座標は

①、②の方法 ローカル座標(-3,0.5,1) ワールド座標(-2,1.5,2

③の方法   ローカル座標(-2,1.5,2) ワールド座標(-1,2.5,3

となります。

 

③の場合だけワールド座標が変わるため、変な場所に作成されそうな気がしますが、パーツを差し替えするときは既に親子関係の座標を差分として持ってることが多く、③で親に接続するという処理を行います。