クォータニオン
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 43/71。
Quaternionは回転を表すUnityの型です。transform.rotationもその一つで、Quaternion.Eulerが返す値も同じ型です。4つの数値x、y、z、wは角度ではないので、自分で設定する必要はありません。回転を使うときは、掛け算をします。回転をベクトルに掛けると、そのベクトルの向きが変わります。
Vector3 a = Quaternion.Euler(0, 90, 0) * Vector3.forward; // (1, 0, 0)
Vector3 b = Quaternion.Euler(0, 0, 45) * new Vector3(2, 0, 0); // (1.41, 1.41, 0)
Vector3 lamp = transform.position + transform.rotation * new Vector3(0, 1, 2);回転は左側に置きます。Vector3.forward * transform.rotationはコンパイルできません。3行目では、オブジェクト自身の回転でオフセットの向きを変えているため、lampはオブジェクトの向きに関係なく、オブジェクト自身の方向を基準にして1単位上、2単位前の点になります。
回転に別の回転を掛けると、2つの回転が組み合わさります。transform.rotation * Quaternion.Euler(0, 90, 0)は、オブジェクトを回転させた後、その自身のy軸を中心に4分の1回転させます。順序を逆にすると、4分の1回転はワールドのy軸を中心に行われます。直立したオブジェクトでは、どちらも同じ結果になります。30度傾いた飛行機ではそうなりません。自身のy軸も一緒に傾くためです。
Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0); // 機首 (0.87, 0.5, 0):旋回しながら上昇する
Quaternion world = Quaternion.Euler(0, 90, 0) * banked; // 機首 (1, 0, 0):水平を保つQuaternion.identityはまったく回転していない状態で、Instantiateに渡したものです。これを掛けても何も変わらず、transform.rotation = Quaternion.identity;とすると、オブジェクトは回転していない姿勢に戻ります。
チャレンジ
中級スペースキーで、銃と一緒に向きを変える3発の弾を扇状に発射できるようにします。
Instantiateの行をfor (int i = -1; i <= 1; i++)に置き換えます。- その中で、
Quaternion aim = transform.rotation * Quaternion.Euler(0, i * spread, 0);を設定します。 - それぞれの弾を、方向に沿って1単位先に生成します:
Instantiate(bulletPrefab, transform.position + aim * Vector3.forward, aim);。
「プレイ」を押し、向きを変えて発射します。3発の弾が20度ずつ間隔をあけて扇状に広がります。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Gun : MonoBehaviour
{
public GameObject bulletPrefab;
public float turnSpeed = 90f;
public float spread = 20f;
void Update()
{
if (Input.GetKey(KeyCode.RightArrow)) transform.Rotate(0, turnSpeed * Time.deltaTime, 0);
if (Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(0, -turnSpeed * Time.deltaTime, 0);
if (Input.GetKeyDown(KeyCode.Space))
{
// 弾は1発、真正面に飛ぶ。-spread度、0度、spread度の3発を発射する。
Instantiate(bulletPrefab, transform.position, transform.rotation);
}
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド