Unity入門

【Unity】Transform.positionの使い方【移動・取得・変更】

この記事について

この記事では Transform.position を使ったオブジェクトの座標操作(取得・移動・変更)について解説します。

この記事でわかること

  • transform.position で現在の座標を取得できる
  • transform.position = new Vector3(x, y, z) で座標を変更できる
  • += を使えば相対的な移動も可能
  • Translate を使うと向きに応じた移動も簡単

Transformとは?

Transformについては以下の記事を参考にしてください。

Transform.positionをスクリプトで制御

Transform.positionをの準備

まずはヒエラルキーで右クリックをして空のGameObjectとCubeを1つずつ用意します。
・「右クリック」→「Create Empty」
・「右クリック」→「3D Object」→「Cube」

作成できたらCubeを空のGameObjectの子オブジェクトにして、空のGameObjectのPositionを(-3,0,-3)にしてください。

次にスクリプトを作成してCubeにアタッチしてください。

positionでWorld座標を取得する

オブジェクトのWorld座標を確認したいときは「transform.position」を取得します。
World座標とは3D空間の原点からの座標のことです。要は親オブジェクトに左右されない座標のことです。

using UnityEngine;

public class Transform_position : MonoBehaviour
{
    void Start()
    {
        Vector3 pos = transform.position;
        Debug.Log("現在の座標: " + pos);
    }
}

実行してみると、 x, y, z のWorld座標がログに表示されます。Cubeの座標は(0,0,0)だけど親オブジェクトが(-3,0,-3)だからWorld座標は(-3,0,-3)ですね。

localPositionでLocal座標を取得する

オブジェクトのLocal座標を確認したいときは「transform.localPosition」を取得します。
Local座標とは親オブジェクトからの座標のことです。要は親オブジェクトに左右される座標のことです。

using UnityEngine;

public class Transform_position : MonoBehaviour
{
    void Start()
    {
        Vector3 pos = transform.localPosition;
        Debug.Log("現在の座標: " + pos);
    }
}

実行してみると、 x, y, z のLocal座標がログに表示されます。親オブジェクトが(-3,0,-3)だけど、Cubeの座標は(0,0,0)だからLocal座標は(0,0,0)ですね。

new Vector3(x, y, z)で座標を変更する

オブジェクトの位置は「new Vector3(x, y, z)」で直接指定できます。

using UnityEngine;

public class Transform_position : MonoBehaviour
{
    void Start()
    {
        // World座標(0, 0, 0)の位置に移動
        transform.position = new Vector3(0, 0, 0);
        Debug.Log("現在のWorld座標: " + transform.position);
        Debug.Log("現在のLocal座標: " + transform.localPosition);
    }
}

実行してみると、オブジェクトを一瞬で指定位置に移動できました。

+=,-=で相対的に移動する

座標を少しずつ動かす場合は「+=」,「-=」等を使うことで実装できます。

using UnityEngine;

public class Transform_position : MonoBehaviour
{
    void Update()
    {
        // 毎フレーム右に移動
        transform.position += new Vector3(0.01f, 0f, 0f);
        Debug.Log("現在のWorld座標: " + transform.position);
    }
}

実行してみると、Updateのたびにオブジェクトが右に動いていきます。ちなみに前項とは違い今回は足し算をしているので一瞬で移動する処理ではありません

Translateで相対的に移動する

transform.Translate() を使うと前項の移動と同じことができます。他では分けて説明されてわかりにくいですが使いやすい方で書きましょう。
※Vector3.forwardについてはVector3の記事を参考にしてください。

using UnityEngine;

public class PositionTest : MonoBehaviour
{
    void Update()
    {
        // 前方向に移動(オブジェクトの向きに依存)
        transform.Translate(Vector3.forward * Time.deltaTime);
    }
}

まとめ

  • transform.position → 座標を取得/変更できる
  • transform.position = new Vector3(…) → 絶対位置の指定
  • +=,-= → 相対移動(少しずつ動かす)
  • Translate → オブジェクトの向きに応じた移動