Quaternion을 이용한 캐릭터 및 무기 회전
private void RotateCharacter(Vector2 direction)
{
float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
characterRenderer.flipX = Mathf.Abs(rotZ) > 90f;
weaponPivot.rotation = Quaternion.Euler(0,0,rotZ);
}
오늘 구현한 부분은
1. 2D게임에서 마우스가 캐릭터 보다오른쪽에 있으면 오른쪽을 보고, 캐릭터 보다 왼쪽에 있으면 왼쪽을 보도록 해주는 작업이다.
2. 무기는 마우스 위치에 따라 방향이 정해지도록 구현하기이다.
여기서 먼저 알아야 될 것이 있다.
ArcTangent(아크탄젠트)
아크탄젠트가 뭐냐?
sin cos tan가 나오는 삼각함수부터 시작해보자. 삼각함수는 각도(세타) 값이 주어졌을 때, 삼각의 비율을 알 수 있다. 여기에 Arc를 붙히면 역함수를 뜻해 역삼각함수라고 한다.
역삼각함수까지 왔다.
삼각함수가 각도를 통해 비율을 알았다면, 역삼각함수는 비율을 통해 각도를 알 수 있는 것이다.
그래서 우리가 사용할 부분은 역삼각함수 중 탄젠트 부분으로 아크 탄젠트 공식을 사용하게 된다.
탄젠트의 공식은 높이/밑변 이다. 이를 2d좌표로 본다면 x,y좌표로도 볼 수 있다.
그러니 우리는 지금 마우스의 위치를 알고 있다. => x,y좌표값 => 즉 비율을 알고 있다고 할 수 있다. 그러면 이제 비율을 알았으니 아크 탄젠트를 적용하여 각도를 구할 수 있다.
아크탄젠트는 각도를 알아낸 후에 Quaternion.Euler를 통해 rotation값을 알아낼 수 있다.
거의 다 왔다.
Atan2는 y,x순서로 넣어주면 되고,
보통 수학에서는 라디안이라는 개념을 사용하는 데 180도를 파이라고 표시한다. 이를 디그리로 180도 라고 다시 표시 해주는 작업을 해야한다.
그 부분이
float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
이 부분이다. 각도(rotZ)는 아크탄젠트로 y,x좌표로 비율 계산하고 파이 개념인 라디안을 다시 디그리 180도 개념으로 바꾸는 작업.
characterRenderer.flipX = Mathf.Abs(rotZ) > 90f;
2d에서 캐릭터를 뒤집어 방향을 조절할 수 있는 filp을 통해 방향을 조절해 줄거다.
Abs는 절대값을 주는 함수이고, 알아낸 각도가 절대값 90보다 크면 플립을 해줘라 하는 부분이다.
weaponPivot.rotation = Quaternion.Euler(0,0,rotZ);
마지막으로, 무기의 각도를 조절하는 부분이다.
피봇기준으로 rotation은 Euler를 통해 직접 각도를 입력받을 수 있다.
그래서 우리가 조절해줄 각도는 z값만 바꾸면 되기에 x,y는 놔두고 앞에서 구한 세타값(각도)를 넣어주면 마우스 위치에 맞게 무기가 회전되는 것을 볼 수 있다.
지금은 스프라이트 문제가 있어 이상하게 보이지만 기능은 정상작동한다..