mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
//mousePos로 향하는 벡터
dir = mousePos - point;
// dir의 크기가 0이 아닌지 확인
if (dir.magnitude > 0)
{
angle = Mathf.Acos((mousePos.x - point.x) / dir.magnitude) * (180 / Mathf.PI);
if (mousePos.y < point.y)
{
angle *= -1;
}
}
마우스 커서가 위치한 방향으로 회전하는 것을 확인하기 위한 코드이다.
먼저 카메라로부터 마우스의 월드에서의 위치를 받아와 point에서 마우스로 향하는 벡터를 구해준다.
Vector A - VectorB를 통해 B에서 A로 향하는 벡터를 구할 수 있다.
이어서 각도를 구하는 과정을 살펴보도록 하겠다.
[부연 설명]
angle = Mathf.Acos((mousePos.x - point.x) / dir.magnitude) * (180 / Mathf.PI);
삼각함수의 역함수를 활용해 삼각비를 통해 각도를 구할 수 있다.
※ Acos = Arccos = Cos함수의 역함수
먼저 마우스의 x 좌표값과 point의 x 좌표값을 빼서 나온 값은 우리가 찾고자 하는 각 θ를 가지는 직각삼각형의 밑변으로 볼 수 있다. 그리고 dir.magnitude는 벡터의 크기를 나타내는 것으로 빗변으로 볼 수 있기에 밑변/빝변 = Cos(θ)인 것이다.
→ θ = Acos(밑변/빝변)
여기에 180/π를 곱해주는 이유는 Acos(밑변/빝변)가 반환하는 값이 라디안 형태이므로 우리가 사용하는 degree(각도) 형태로 바꿔 주기 한 것이다.
각도를 라디안으로 바꿔줄 때: 각도 π/180
라디안을 각도로 바꿔줄 때: 라디안 180/π

Vector2 normalizedDir = dir.normalized; // 노멀라이즈된 방향 저장
Vector2 inverse_dir = normalizedDir * -1 * len; // 노멀라이즈된 방향을 사용
Vector2 point = dir + inverse_dir; // 원래의 dir을 사용

구상한 원리를 설명하자면 이와 같다.
- 점 a에서 마우스로 향하는 벡터를 노멀라이즈하여 방향 성분만 남기고 이를 len만큼 곱한 뒤 -1을 곱해 반대 방향을 향하게 만든 것을 구하고 이를 inverse_dir 이라고 저장한다.
- 이를 dir과 더하면 dir로 향하지만 len만큼 떨어진 벡터를 구할 수 있다.
- 해당 벡터로 점 a를 이동한다.
이에 따라 코드를 작성하였다고 생각했지만 1번에서 나온 문제가 발생하지 않았을 때에도 점 a가 마우스 커서에 위치하는 상황이 있어 앞선 오류로 인한 것인지, 전체적으로 구상한 원리가 문제인 것인지 확인이 필요한 상황이다.