현재 Player 가 Target을 향해 바라볼 수 있게끔 회전을 하려한다.
두 점을 잇는 직선의 θ
를 구한다음 Z축으로 θ
회전을 주면된다.
일반적으로 두 점을 잇는 직선의 각도를 구할 때 아트 탄젠트 (탄젠트의 역함수) 를 사용한다.
Atan
x,y 좌표가 주어졌을 때 x축과 이루는 각을 θ
라 하면 tan(θ) = y/x
여기서 tan(θ) = y/x
에 역함수를 취하면 θ
를 구할 수 있다.
이 역함수가 아크 탄젠트 tan(θ) = tan-1(y/x) = atan2(y,x)
아크 탄젠트 함수는 두 가지가 있다.
atan(y/x) - 하나의 좌표에 대한 값 계산 -π/2에서 π/2 사이의 범위 { (1,1) / (-1, -1) 를 구별 못한다 }
atan2(y,x) - 두 개의 좌표에 대한 값 계산 -π에서 π 사이의 범위
그러므로 atan2 를 이용하여 Target 과의 회전값을 구하여한다.
float angle = Mathf.Atan2(y, x) * Mathf.Rad2Deg;
Atan2의 반환값은 라디안(Radian)이기 때문에 도(Degree) 로 변환해 준다.
1 라디안 = 원의 반지름과 같은 길이의 호가 중심각으로 만들 때 그 각의 크기 대략 57.f { 180 / π }
위의 공식대로 angle만큼 Object를 Z 회전을 시켰더니 잘 동작하지않는다.
![]() |
![]() 약 -40 Degree |
이유는 시작점의 문제인데, 유니티 문서에선 Atan 함수가 X축과 0에서 시작하여 (x,y)서 끝나는 2D 벡터 사이의 각도 라고 되어있다.
즉, X축으로 부터 θ
인거지 Y축으로부터 θ
인것이 아니다.
Y축을 기준으로 시작하기 위해서는 +90 Degree 만큼 더해 주어야 한다.
float angle = Mathf.Atan2(y, x) * Mathf.Rad2Deg + 90.0f;
![]() |
![]() 약 50 Degree |
Vector2.Angle(from, to)
-> 두 벡터 간의 각도 차이 (Player가 원점이 아님)
'유니티' 카테고리의 다른 글
Behavior Graph (0) | 2025.05.28 |
---|---|
유니티 Input System (0) | 2025.02.18 |
Coroutine (0) | 2022.04.07 |
Photon Animator View (Trigger) (0) | 2022.04.06 |
Character Controller / RigidBody / Transform (0) | 2022.03.29 |