오늘은 발사체(Projectile)를 만들 때 필수적인 회전 연산에 대해 정리해 보겠습니다.
Mathf.Atan2는 두 지점 사이의 상대적인 위치(y, x)를 입력받아 그 방향이 나타내는 각도를 라디안(Radian) 단위로 반환하는 함수입니다. 일반적인 탄젠트 역함수(Atan)와 달리, x값이 0인 경우나 사분면의 위치를 스스로 판단하여 정확한 각도를 찾아주기 때문에 게임 개발에서 방향을 결정할 때 가장 많이 쓰입니다.
중요한 점은 매개변수의 순서가 (x, y)가 아닌 (y, x)라는 사실입니다. y축 차이값을 먼저 넣고 x축 차이값을 뒤에 넣어야 올바른 각도가 나옵니다.
<style>
using UnityEngine;
public class RotationTest : MonoBehaviour
{
public Transform target;
void Update()
{
if (target != null)
{
// 타겟과 나 사이의 거리 차이 구하기
Vector2 direction = target.position - transform.position;
// Atan2를 사용하여 각도(라디안) 계산 (y를 먼저 넣음)
float angleRad = Mathf.Atan2(direction.y, direction.x);
}
}
}
</style>
수학 함수인 Atan2의 결과값은 라디안(Radian) 단위입니다. 하지만 유니티의 인스펙터나 우리가 흔히 쓰는 회전 값은 도(Degree, 0~360도) 단위를 사용합니다.Mathf.Rad2Deg는 라디안 값을 도(Degree) 값으로 바꾸기 위해 곱해주는 상수값()입니다. 이 값을 결과에 곱해주어야 우리가 이해할 수 있는 각도 숫자로 변환됩니다.
<style>
using UnityEngine;
public class RotationTest : MonoBehaviour
{
public Transform target;
void Update()
{
if (target != null)
{
// 타겟과 나 사이의 거리 차이 구하기
Vector2 direction = target.position - transform.position;
// Atan2를 사용하여 각도(라디안) 계산 (y를 먼저 넣음)
float angleRad = Mathf.Atan2(direction.y, direction.x);
// Atan2 결과(라디안)에 Rad2Deg를 곱해 0~360도 단위로 변환
float angleDeg = angleRad * Mathf.Rad2Deg;
Debug.Log("현재 타겟을 향한 각도: " + angleDeg);
}
}
}
</style>
유니티에서 회전을 다루는 방식은 크게 두 가지가 있습니다.
Euler (오일러 각): X, Y, Z축의 회전 각도(Vector3)를 의미합니다. 직관적이지만 특정 축이 겹치면 회전이 멈추는 짐벌 락(Gimbal Lock) 현상이 발생할 수 있습니다.
Quaternion (쿼터니언): x, y, z, w라는 4개의 성분으로 회전을 표현하는 수학적 방식입니다. 계산이 복잡하고 직관적이지 않지만, 짐벌 락 현상이 없고 회전 연산이 매우 안정적입니다.
유니티의 transform.rotation은 내부적으로 쿼터니언을 사용합니다. 따라서 오일러 각도(Degree)를 적용하려면 Quaternion.Euler 함수를 사용하여 변환해주어야 합니다.
<style>
using UnityEngine;
public class ProjectileRotation : MonoBehaviour
{
public Transform target;
void Update()
{
if (target == null) return;
Vector2 direction = target.position - transform.position;
// 1. 각도 계산 (라디안)
float angleRad = Mathf.Atan2(direction.y, direction.x);
// 2. 각도 변환 (Degree)
float angleDeg = angleRad * Mathf.Rad2Deg;
// 3. 쿼터니언으로 변환하여 회전 적용
// 2D 게임이므로 Z축을 기준으로 회전시킴
transform.rotation = Quaternion.Euler(0, 0, angleDeg);
}
}
</style>
오늘은 발사체가 타겟을 정확히 바라보게 만드는 수학적 과정을 배웠습니다.
Mathf.Atan2를 통해 방향 벡터로부터 각도를 추출하고, 이를 Rad2Deg로 변환하여 평소 인식하고 있는 단위로 바꾼 후 최종적으로 쿼터니언 시스템에 적용하는 이 흐름이 핵심인것을 깨달았습니다.