Menu
CoddyTech

オイラー角

CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 40/63。

transform.eulerAnglesは、オブジェクトの回転をx、y、z軸の周りの3つの角度で度数表示したものです。Unityは回転をクォータニオン(次のレッスンで説明します)として保存しており、角度を読み取るたびに3つの角度に変換し直します。値は常に0から360までです。板をz軸の周りに-10度傾けて、値を読み戻してみましょう。

transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z);   // 350

-10を設定しましたが、コードが読み取るのは350なので、if (transform.eulerAngles.z < -5)がtrueになることはありません。読み戻すと3つの数値すべてが変わることがあります。(100, 0, 0)を設定すると、同じ向きを別の表現で表した(80, 180, 180)が読み取られます。Quaternion.Euler(x, y, z)は逆方向の変換を行い、どんな角度でも受け付けます。-10、350、710は同じ回転になります。そこで、角度を独自のfloat変数に保持し、そこで変更や範囲制限を行ってから、その値を使って回転全体を設定しましょう。このシーソーは矢印キーで傾き、どちらの方向にも20度で止まります。

public float speed = 40f;
float tilt;

void Update()
{
    tilt += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
    tilt = Mathf.Clamp(tilt, -20f, 20f);
    transform.rotation = Quaternion.Euler(0, 0, tilt);
}

読み取った角度の一部だけを変更してはいけません。transform.eulerAngles.x = 110;はコンパイルできません(position.xと同様にCS1612になります)。また、eulerAnglesをコピーしてxを変更し、そのコピーを代入し直すと、Unityが変換した角度を基準にすることになります。(100, 0, 0)を設定した後、コピーは(80, 180, 180)になります。xに10を加えると(90, 180, 180)になり、オブジェクトは110度まで回転するのではなく、90度に戻ります。

challenge icon

チャレンジ

中級

ポール上の防犯カメラは、左右に往復する必要があります。前方を向いた状態(y軸まわりに0度)から右に向かって、毎秒speed(30)度ずつ回転し、limit(45)で折り返して、-limit(-45)まで回転し、再び折り返す、という動きを繰り返します。その間ずっと、x軸まわりにtilt(20)度下向きに傾いた状態を保ちます。

再生を押してください。スターターは45で折り返しますが、-45ではそのまま回転し続けます。原因を見つけてスクリプトを修正し、チェックを押してください。

自分で試してみよう

using UnityEngine;

public class Sweep : MonoBehaviour
{
    public float speed = 30f;
    public float limit = 45f;
    public float tilt = 20f;   // x軸を中心に下向きに傾ける角度(度)
    float direction = 1f;

    void Update()
    {
        transform.Rotate(0, direction * speed * Time.deltaTime, 0, Space.World);
        float angle = transform.eulerAngles.y;
        if (angle > limit) direction = -1f;
        if (angle < -limit) direction = 1f;
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

物理演算とゲームプレイのすべてのレッスン