UnityのTranslateにご注意

UnityのTransform.Translate関数には、じつはちょっと注意が必要です。 簡単に言うと、transform.Translate(Vector3.right)とtransform.position += Vector3.rightは異なるというお話です。

手順1

まず、原点に球体を用意します。

f:id:cflat-inc:20141028105357p:plain

手順2

次にInspector上でPositionをX方向に+2移動させると、当然赤い球体のようになります。

f:id:cflat-inc:20141028105412p:plain

手順3

Inspector上でRotationをY軸中心に90度回転させると、向きは変われど、位置は変わりません。 これは、手順2と手順3を入れ替えても同じ結果になります。

f:id:cflat-inc:20141028105421p:plain

手順4

さて、ここでもう一つ緑の球体を用意させます。 Inspector上でRotationをY軸中心に90度回転させます。

f:id:cflat-inc:20141028105450p:plain

手順5

さあ、ここでソース上で下記のようにTranslateさせてみましょう。

   void Start () {
        transform.Translate(2.0f * Vector3.right);
    }

f:id:cflat-inc:20141028105632p:plain

あれ、手順3と結果が異なりますね。 Translate(Vector3)は、ローカル座標系をベースとした関数であるということがわかります。 ちなみに、Position.Xは-2.384186e-07という値になっております。

手順6

ここでソースを下記のように変更してみます。

   void Start () {
        //transform.Translate(2.0f * Vector3.right);
        transform.position += 2.0f * Vector3.right;
    }

結果は、

f:id:cflat-inc:20141028110745p:plain

完全に手順3と一致しましたね。 こちらはInspectorでの操作と同じ結果ということですね。

でもこれ実はTranslate関数でも同じことができて、

   void Start () {
        transform.Translate(2.0f * Vector3.right, Space.World);
    }

とやれば良い。 デフォルトがローカル座標系になっておるのですね。

勘違いされている方もいるようですので、ご注意あれ。