【Unity】オブジェクトの向きを取得する

こじゃら
こじゃら

ゲームオブジェクトがどこに向いているかを知りたい場合はどうすればいいの~?

このは
このは

…方向音痴ね。
でもTransformを見れば簡単に分かるから安心して!
向きはベクトルとして得られるわ!

本記事では、ゲームオブジェクトの向きをスクリプトから取得する方法をご紹介します。

正面の向きのベクトルを取得する

ゲームオブジェクトの正面の向きは、Transform.forwardフィールドから取得することができます。

var direction = transform.forward;

これは、シーンエディタで該当するオブジェクトを選択したときに表示されるz軸方向(青色)のベクトルに相当します。

Transform.forwardワールド座標系で表現された長さが1の単位ベクトルです。

このは
このは

せっかくなので、他の向きを見る方法もあわせて紹介するね!

右・上向きのベクトルを取得する

右方向はTransform.right上方向はTransform.upから取得できます。
Transform.rightはシーンエディタで該当オブジェクトを選択したときに表示されるx軸方向(赤色)のベクトル、Transform.upはy軸方向(緑色)のベクトルに相当します。

Transform.forwardと同じくワールド座標系におけるベクトルです。

こじゃら
こじゃら

例えば、後ろとかとか向きを求めたいときはどうするの?

このは
このは

ベクトルの符号反転を駆使すれば求められるわ!

後ろ・左・下向きのベクトルを取得する

今度はこれまでの応用です。

後ろ、左、下向きのベクトルは、それぞれ正面、右、上向きのベクトルの符号を反転させたベクトルとなります。

var back = -transform.forward;
var left = -transform.right;
var down = -transform.up;

サンプル

オブジェクトのリアルタイムな向きをデバッグログで表示するサンプルです。

スクリプト

CalcDirection.cs

using UnityEngine;

// オブジェクトの向きを取得する
public class CalcDirection : MonoBehaviour
{
    private Transform _transform;

    private void Start()
    {
        // transformに毎回アクセスすると重いので、キャッシュしておく
        _transform = transform;
    }

    private void Update()
    {
        // 正面・右・上向き
        var forward = _transform.forward;
        var right = _transform.right;
        var up = _transform.up;

        // 後ろ・左・下向き
        var back = -forward;
        var left = -right;
        var down = -up;

        // ログ表示
        Debug.Log($"正面:{forward}, 右:{right}, 上:{up}, 後ろ{back}, 左{left}, 下{down}");
    }
}

実行結果

ローカル座標系における向きについて

これまでご紹介した向きはすべてワールド座標系でしたが、ローカル座標系の場合は値が常に固定です。
transform.~ではなく、Vector3.~にコードを置き換えれば良いです。

// 正面・右・上向き
var forward = Vector3.forward;
var right = Vector3.right;
var up = Vector3.up;
// 後ろ・左・下向き
var back = Vector3.back;
var left = Vector3.left;
var down = Vector3.down;

さいごに

ワールド座標系におけるオブジェクトの向きはTransform.rotationを用いて算出することも可能ですが、正面や右向きなど決まった方向なら簡単に調べることが可能です。

向きベクトルはクォータニオンと並んで回転を扱うのに役立ちます。
是非活用してみてください!

参考サイト