현재 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 회전을 시켰더니 잘 동작하지않는다.

하얀색 Object가 아니라 다른곳을 가리키고 있다

약 -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

+ Recent posts