読者です 読者をやめる 読者になる 読者になる

デジタルフロッグ

Unityのアプリの開発をしながらいろいろと忘れないための備忘録でございます。

positionプロパティとlocalPositionプロパティの違い

C# Unity

どっちもポジションを動かせるしまあどっちでも変わらないんじゃないのかと思ってしまったり、使いどころがいまいちつかめてない人もいるはず。

という事で今日はpositionとlocalPositionの違いを書いていきたいと思います。

positionとは

ポジションはワールド座標を示し、オブジェクトのポジションを変更すると指定した位置にオブジェクトは移動します。

子オブジェクトが移動したとしてもワールド座標の通りに移動するので親子関係に関係なく、指定した位置に移動する事になります。

localPositionとは

次にlocalPositionですが、こちらは親子関係にある場合に通常のtransform.positionとは違った意味合いになってきます。localPositionは親子関係の影響を受けて親オブジェクトに対しての相対的に作用しローカル座標で移動する事になります。

実際にどう違うか見てみましょう。

void Start () {
    var cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
    var cube2 = GameObject.CreatePrimitive (PrimitiveType.Cube);
    var sphere = GameObject.CreatePrimitive (PrimitiveType.Sphere);

    //cube2オブジェクトの名前をcube2に変更

    cube2.name = "cube2";
    cube.transform.parent = sphere.transform;
    cube2.transform.parent = sphere.transform;
    sphere.transform.position = new Vector3 (0, -2, 0);
    cube.transform.position = new Vector3(0,2,0);
    cube2.transform.localPosition = new Vector3(0,2,0);
}

このようにスクリプトを書いて実行してみます。

親となるsphereはy座標が-2ですが、cubeもcube2もy座標は2となっています。

それでは実行してみましょう。

f:id:karaagedigital:20160915120934p:plain

同じようにy座標は2にしたのにCubeは重ならずに等間隔に離れて表示されてました。

1つはワールド座標を軸にしてy座標を2にしたのに対して、一つはローカル座標を軸にしてy座標を2にしました。

親のy座標は-2なので、ローカル座標で移動したCubeはy座標が0の位置に、ワールド座標で移動したものはy座標2の位置に移動しています。

ワールド座標で移動したものはローカル座標であればy座標は4になります(親オブジェクトの位置が0になるので)。

 

transform.positionとtransform.localPositionとの違いはこれです。transform.positionだけでも対応は出来るけど、親子関係に基づいて移動させるものがあればワールド座標よりローカル座標で移動させた方が楽な時もありますからね。