Menu
CoddyTech

쿼터니언

Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 41번째.

Quaternion은 회전을 나타내는 Unity의 형식입니다. transform.rotation이 이에 해당하고, Quaternion.Euler가 반환하는 값도 마찬가지입니다. 네 개의 숫자 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은 컴파일되지 않습니다. 세 번째 줄은 오프셋을 오브젝트 자체의 회전만큼 회전시키므로, lamp는 오브젝트가 어느 방향을 향하든 오브젝트 자체의 방향을 기준으로 1단위 위쪽, 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;를 설정하면 오브젝트가 회전하지 않은 자세로 돌아갑니다.

challenge icon

챌린지

중급

총은 왼쪽 및 오른쪽 화살표로 회전하고, Space를 누르면 정면으로 총알 하나를 발사합니다. Space를 눌렀을 때 총알 세 발을 부채꼴로 발사하도록 바꾸세요. 한 발은 정면으로, 한 발은 총이 향하는 방향에서 오른쪽으로 spread (20)도 회전하여, 나머지 한 발은 왼쪽으로 20도 회전하여 발사합니다. 발사 각도는 총이 회전할 때 함께 바뀌어야 합니다.

  • 각 총알은 자기 방향을 향합니다 (미리 만들어진 Bullet 스크립트가 총알을 앞쪽으로 날려 보냅니다).
  • 각 총알은 자기 방향을 따라 총의 중심에서 1단위 떨어진 곳에서 시작합니다.

Play를 누르고, 회전하고 발사한 다음 Check를 누르세요.

직접 해보기

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))
        {
            // 총알 한 발을 정면으로 발사합니다. 세 발을 발사하세요: -spread, 0, spread도 방향으로.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

물리와 게임플레이의 모든 레슨