見出し画像

【Unity 初心者向け】オブジェクトの移動③ | Transform.Translateを徹底解説 | World座標とLocal座標の違い

今回は、Transform.Translate()を使ってオブジェクトを動かす方法を確認します。

これまでの記事では、transform.positionを変更してオブジェクトを移動してきました。

例えば、オブジェクトを右方向へ動かす場合は、次のように書けます。

transform.position += Vector3.right * speed * Time.deltaTime;

Unityでは、このように position を直接変更する方法以外にも、Transform のメソッドを使ってオブジェクトを移動する方法があります。

その1つが、以下のメソッドです。

transform.Translate();

今回は Translate の基本的な使い方に加えて、

  • World座標

  • Local座標

  • Space.World

  • Space.Self

についても確認していきます。

特に、オブジェクトを回転させたときに移動方向がどう変わるのかを見ると、World座標とLocal座標の違いがわかりやすくなります。



1.Transform.Translate

1-1.Transform.Translateとは

Transform.Translate() は、現在の位置から指定した方向へオブジェクトを移動するためのメソッドです。

例えば、次のように書きます。

transform.Translate(Vector3.right);

Vector3.right は右方向を表しています。
そのため、このコードを実行すると、オブジェクトは現在位置から右方向へ移動します。

ただし、Update()の中でこのまま実行すると1フレームごとの移動量が大きすぎるため、通常は移動速度を表す変数や Time.deltaTime と組み合わせます。


1-2.Translateを使ってCubeを動す

まずは、Cubeを右方向へ動かしてみましょう。
スクリプトファイル:TranslateMove.cs を作成し、以下のコードを記述します。

public class TranslateMove : MonoBehaviour
{
    public float speed = 3f;    // 移動速度

    void Update()
    {
        // オブジェクトを右方向に移動させる
        transform.Translate(
            Vector3.right * speed * Time.deltaTime
        );
    }
}

3DObject から Cube を作成し、TranslateMove を Cube にアタッチしてゲームを実行してみてください。

Cubeが右方向へ動き続ければ成功です。

コードの中では、

Vector3.right

で移動する方向を指定し、

speed

で移動速度を指定しています。さらに、

Time.deltaTime

を掛けることで、フレームレートによる移動速度の違いを一定にしています。


1-3.positionで動かす方法との違い

これまで使ってきた transform.position を直接更新する方法でも、同じようにオブジェクトを移動できます。

例えば、右方向へ移動する場合は次のように書けます。

transform.position +=
    Vector3.right * speed * Time.deltaTime;

Translateを使う場合はこちらです。

transform.Translate(
    Vector3.right * speed * Time.deltaTime
);

どちらもオブジェクトを移動することができます。
考え方としては、

  • transform.position は、オブジェクトの位置そのものを扱う

  • Translate は、現在位置からどの方向へどれだけ移動するかを指定する

と考えるとわかりやすいでしょう。
Unityでは、同じような移動でも複数の書き方があります。

どちらか一方だけを使わなければいけないわけではありません。


2.Translateの移動方向

Translateを使うときに重要になるのが「どの座標を基準にして移動方向を考えるか」という点です。

Unityには、主に次の2つの座標の考え方があります。

  • World座標

  • Local座標

この違いを理解するために、まずはそれぞれ確認してみましょう。


2-1.World座標とは

World座標は、ゲーム空間全体を基準にした座標 です。

UnityのSceneビューでは、X・Y・Zの軸が表示されています。
基本的には、軸によって下のようにあらわされます。

  • X軸:左右

  • Y軸:上下

  • Z軸:前後

World座標の方向は、オブジェクト自身を回転させても変わりません。

例えばCubeを斜めに回転させても、World座標のZ方向は常に同じ方向です。


2-2.Local座標とは

Local座標は、オブジェクト自身を基準にした座標 です。

オブジェクトには、それぞれ自分自身のX・Y・Z方向があります。
オブジェクトを回転させると、そのオブジェクト自身の方向も一緒に回転します。

例えばCubeを右へ45度回転させると、Cube自身の「前方向」も45度右へ向きます。
つまり、World座標はゲーム空間全体を基準にする のに対して、Local座標はオブジェクト自身を基準にする という違いがあります。


2-3.Space.Worldを使ってみよう

Translateでは、移動するときにどの座標を基準にするのかを指定できます。

World座標を基準にする場合は、

Space.World

を指定します。
Update関数内を、次のように変更してみましょう。

void Update()
{
    transform.Translate(
        Vector3.forward * speed * Time.deltaTime,
        Space.World
    );
}

Vector3.forward は、

(0, 0, 1)

を表しており、Zのプラス方向、つまり画面の奥の方向です。

ここで Cube を選択し、Y軸方向に 45度程度回転 させてみましょう。

その状態でゲームを実行します。
Cube自身は斜めを向いていますが、移動方向は変わらず、画面の奥の方向へ遠ざかっていくのが確認できると思います。

Space.Worldを指定しているため、Cubeの向きとは関係なく、World座標のZ方向へ進みます。


2-4.Space.Selfを使ってみよう

次は、

Space.Self

を使ってみます。
コードを次のように変更します。

transform.Translate(
    Vector3.forward * speed * Time.deltaTime,
    Space.Self
);

同じように CubeをY軸方向へ45度程度回転 させてゲームを実行してみましょう。

今度はCubeが斜め奥の方向へ移動します。
これは、

Space.Self

によって、Cube自身のLocal座標を基準にして移動しているためです。
つまり、Cube自身の前方向へ進んでいます。


2-5.Space.WorldとSpace.Selfの違い

ここまでの違いを整理してみましょう。

Space.World

transform.Translate(
    Vector3.forward * speed * Time.deltaTime,
    Space.World
);

ゲーム空間全体のZ方向を基準にして移動します。
Cubeを回転させても、移動方向は変わりません。


Space.Self

transform.Translate(
    Vector3.forward * speed * Time.deltaTime,
    Space.Self
);

オブジェクト自身のZ方向を基準にして移動します。
Cubeを回転させると、その向きに合わせて移動方向も変わります。

簡単に考えるなら、

Worldは「世界から見た方向」

Selfは「自分から見た方向」

と覚えておくとよいでしょう。


2-6.Space.Selfは省略できる

実はTranslateでは、座標系を指定しなかった場合、

Space.Self

が使われます。
そのため、

transform.Translate(
    Vector3.forward * speed * Time.deltaTime,
    Space.Self
);

は、

transform.Translate(
    Vector3.forward * speed * Time.deltaTime
);

と書くこともできます。

どちらも同じように、オブジェクト自身の前方向へ移動します。
今回のようにWorld座標とLocal座標の違いを確認するときは、

Space.World
Space.Self

を省略せずに書いたほうが、違いを理解しやすいでしょう。


2-7.Vector3.forwardとtransform.forwardの違い

ここで少し補足です。

Unityでは、

Vector3.forward

だけでなく、

transform.forward

という書き方もあります。
この2つは似ていますが、意味が少し違います。

Vector3.forwardは常に、World座標に対し

(0, 0, 1)

を表します。
つまり、基準となるZのプラス方向です。

一方、

transform.forward

は、現在そのオブジェクトが向いている前方向 を表します。

例えばCubeを45度回転させると、transform.forwardもその方向に変わります。


例えば、次のようなコードを書くこともできます。

transform.Translate(
    transform.forward * speed * Time.deltaTime
);

ただし、この書き方は少し注意が必要です。

transform.forwardは、すでにWorld座標で表された「オブジェクトの前方向」です。

一方、Translateで座標系を省略すると、

Space.Self

として扱われます。そのため、

transform.Translate(
    transform.forward * speed * Time.deltaTime
);

と書くと、World座標で求めた方向をLocal座標としてもう一度解釈することになり、意図した方向に進まない場合があります。

自分自身の前方向へ進ませたいだけなら、

transform.Translate(
    Vector3.forward * speed * Time.deltaTime,
    Space.Self
);

と書くのがわかりやすいでしょう。
また、transform.forwardを使うのであれば、

transform.Translate(
    transform.forward * speed * Time.deltaTime,
    Space.World
);

とすると、オブジェクトが現在向いている方向へ移動できます。
これは、

transform.position +=
    transform.forward * speed * Time.deltaTime;

とほぼ同じ考え方です。

初心者のうちは、Translateで自分の前方向へ進ませるなら、Vector3.forwardとSpace.Selfを使う、と覚えておくとよいでしょう。


3.今回のまとめ

今回は、Transform.Translate()を使ってオブジェクトを移動する方法を確認しました。

今回のポイントは次のとおりです。


次回は、いよいよ物理演算を使った移動を見ていきます。

Transformで位置を直接変更する方法と、Rigidbodyで速度を与えて動かす方法にはどのような違いがあるのでしょうか。

次回はRigidbody2Dの基本設定を確認しながら、linearVelocityを使ってオブジェクトを左右に動かす方法を紹介します。


こちらはUnity初心者向けの記事をテーマ別にまとめています。
▼ Unity初心者向け記事まとめはこちら


こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!