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
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.