오일러 각
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 40번째.
transform.eulerAngles는 x, y, z축을 기준으로 한 객체의 회전을 도 단위로 나타내는 세 개의 각도입니다. Unity는 회전을 쿼터니언(다음 강의)으로 저장하고, 각도를 읽을 때마다 세 각도를 다시 계산하며, 항상 0부터 360까지의 값으로 반환합니다. 판자를 z축 기준으로 -10도 기울인 다음 값을 읽어 보세요.
transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z); // 350-10을 설정했지만 코드는 350을 읽으므로 if (transform.eulerAngles.z < -5)는 절대 참이 되지 않습니다. 값을 다시 읽으면 세 숫자가 모두 바뀔 수 있습니다. (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도로 되돌아갑니다.
챌린지
중급기둥 위의 보안 카메라가 좌우로 계속 회전해야 합니다. 앞을 향한 상태(y축을 중심으로 0도)에서 오른쪽으로 돌며, y값이 초당 speed(30)도씩 증가하고, limit(45)에 도달하면 되돌아 방향을 바꿔 -limit(-45)까지 회전한 다음 다시 방향을 바꾸는 식으로 계속 움직입니다. 회전하는 동안 내내 x축을 중심으로 tilt(20)도 아래쪽으로 기울어진 상태를 유지합니다.
Play를 누르세요. 시작 스크립트는 45에서 되돌아가지만, -45에서는 계속 회전합니다. 이유를 찾아 스크립트를 수정한 다음 Check를 누르세요.
직접 해보기
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;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.