Version: 2023.1
言語: 日本語
Vectors
ScriptableObject

Quaternion

Unity では、Quaternion クラスを使用して、ゲームオブジェクトの 3 次元の向きを保存したり、ある向きから別の向きへの相対的な回転を示したりします。

このページでは、Quaternion クラスの概要と、Quaternion クラスでスクリプトを作成する際の一般的な使い方について説明します。Quaternion クラスのすべてのメンバーを網羅したリファレンスについては、Quaternion のスクリプトリファレンス を参照してください。

オイラー (Euler) 角 (Inspector に表示されるゲームオブジェクトの回転を表す X、Y、Z の値) と、Unity がゲームオブジェクトの実際の回転を保存するために使用する内部的なクォータニオン (Quaternion) 値の違いを理解することは重要です。このトピックの基本については、Unity の回転と向き を参照してください。

スクリプトで回転を扱うとき、Quaternion クラスとその関数を使用し、回転値を作成、変更します。ある状況では、オイラー角の使用が有効な場合もあります。ただし、以下を注意する必要があります。 - オイラー角を扱える Quaternion クラス関数を使用してください。 - 回転からオイラー値を取得、修正、再適用すると、意図しない副作用が発生することがあります (以下参照)。

クォータニオンを直接作成、変更する方法

Unity の Quaternion クラスには、オイラー角を全く使わずに回転を作成操作できる関数がいくつかあり、ほとんどのケースでこれらを使用するべきです。これらの関数はそれぞれ、コードサンプルのあるスクリプトリファレンスにリンクしています。

回転の作成

回転の操作

Transform クラスには、Quaternion の回転を操作するためのメソッドも用意されています。

オイラー角の使用

場合によっては、スクリプトでオイラー角を使用する方が望ましいこともあります。その場合は、角度を変数に格納し、オイラー角として回転に 適用 するためだけに使用し、最終的にはクォータニオンとして保存しなければならないことに注意してください。クォータニオン から オイラー角を取得することは可能ですが、取得、修正、再適用を行うと問題が発生する可能性が高くなります。

このような問題がどのように発生するかについての詳細は、eulerAngles のスクリプトリファレンス を参照してください。

ここで、一般的によくある 誤り を、ゲームオブジェクトを X 軸の周りで 1 秒につき 10 度回転させようろする例を使用して紹介します。以下は 行うべきでない 事例です。

// 回転スクリプトの誤り #1
// ここでの間違いは、クォータニオンの x 値を変更していることです。
//この値は角度を表すものではなく、求めている結果を生成しません
    
void Update () 
{
    var rot = transform.rotation;
    rot.x += Time.deltaTime * 10;
    transform.rotation = rot;
}
// 回転スクリプトの誤り #2
// クォータニオンからオイラー値を読み取り、変更し、書き込みます。
// これらの値はクォータニオンから計算されるため、
// 新しい回転ごとにまったく異なるオイラー角が返される可能性があり、ジンバルロックが発生する可能性があります。
        
void Update () 
{
    var angles = transform.rotation.eulerAngles;
    angles.x += Time.deltaTime * 10;
    transform.rotation = Quaternion.Euler(angles);
}

以下は、スクリプトでオイラー角を使う時の 正しい 使用法です。

// オイラー角を正しく使用した回転スクリプト
// オイラー角をクラス変数に格納し、オイラー角として適用する場合にのみ
// 使用しますが、オイラー角にもどして読み取ることはありません。
        
float x;
void Update () 
{
    x += Time.deltaTime * 10;
    transform.rotation = Quaternion.Euler(x,0,0);
}

詳細は、Quaternion のスクリプトリファレンス を参照してください。

Quaternion

Vectors
ScriptableObject