[Unity] オブジェクトのY軸が特定の座標に向くように回転させる方法

2021年4月11日

オブジェクトの正面方向(ローカルZ軸)をある座標に向けるには transform.LookAtQuaternion.LookRotation といった関数を使えば簡単にできます。

しかし、オブジェクトの上方向(ローカルY軸)を特定の座標に向けたい場合は少し工夫が必要です。この記事では、オブジェクトのY軸方向をターゲットの座標に向ける方法について紹介します。

正面に目標を捉えてから90度回転させる

正面であるZ軸を3D空間上のある座標に向けた場合、Y軸はそのZ軸から90度傾いた方向を向いています。したがってオブジェクトが正面を向いた後、そのオブジェクトのY軸が指す方向からZ軸が指す方向へ90度回転させてあげることで、Y軸が目的地を指すようになります。

C#のコードで書くと以下のようになります。

// 正面をターゲットに向ける
transform.LookAt(target.transform.position);

// ワールドX軸方向を軸として90度回転させる
transform.rotation *= Quaternion.AngleAxis(90, Vector3.right);

// 確認用の線
Debug.DrawRay(transform.position, transform.up * 100, Color.red);

Quaternion同士の乗算によって回転を合成することができます。

結果、以下のようにオブジェクトのY軸がターゲットの座標に向きます。

Y軸をターゲット座標へ向ける例

徐々にY軸をターゲットに向ける

transform.rotation に直接値を設定すると一瞬で回転が完了しますが、関数 Quaternion.RotateTowards を組み合わせることで、オブジェクトの方向を瞬間的にではなく時間をかけて回転させることができます。

// 回転速度
float maxRadiansDelta = 2.0f;

// ターゲットへの方向ベクトル
Vector3 direction = target.transform.position - transform.position;

// 正面に目標を捉えてから90度回転させた回転を表すQuaternion
Quaternion targetQ = Quaternion.LookRotation(direction, Vector3.up) * Quaternion.AngleAxis(90, Vector3.right);

// 徐々に回転
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetQ, maxRadiansDelta);

以上の一連の処理を Update 関数内などで繰り返しループさせることで、Y軸方向が徐々に目標の座標へと近づきます。回転は maxRadiansDelta の速さで起こります。

実際に回転させてみるとこのように動きます。

以上、UnityでオブジェクトのY軸を特定の座標に向けるように回転させる方法でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です