A.1 삼각함수란?
직각삼감형의 각도에 따른 변 길이의 비율을 반환하는 함수 입니다.
삼각함수로 사인, 코사인, 탄젠트라는 단어를 들어본 적이 있을 겁니다.
A.2 각도로 좌표 구하기
플레이어가 적 캐릭터에게 사격을 하기위해 적과의 각도를 알면 다음과 같이 계산할수 있습니다.
float x = Mathf.Cos(라디안)
float y = Mathf.Sin(라디안)
Vector3 v = new Vector3(x,y) * shootSpeed;
유니티가 제공하는 삼각함수.
Mathf.cos, Mathf.sin Mathf.Tan
유니티가 제공하는 삼각함수는 각도를 매개변수로 사용하지 않고 라디안(호도법)을 사용합니다.
각도 = 라디안 x(180/원주율)
라디안=각도x(원주율/180)입니다.
유니티는 계산을 편하게 하기위해 Mathf.Deg2Rad, Mathf.Rad2Deg를 마련해 놨습니다.
라디안
아래 그림은 각도는 한바퀴를 360도라고 정의했을때 비율이다.
라디안은 반지름1인 원이 한바퀴 도는 둘레가 2πr인데 반지름이 1이름로 2π=360도 이다.
라디안은 결국 쉽게 말하면 한바퀴도는데 2π니까 1도 = 2π/360 = π/180 임.
역으로하면 360도 = 2π 니까 π=180도 뭐 그닥 와닫지는 않지만.
어려운건 아님. 각도는 바퀴고 라디안은 굴러간거리라고 생각하면 편함.
가만 생각해보면 원이 한바퀴도는건 파이=3.141592아니었나 생각되지만 그건 지름이 1일 경우이고 라디안은 반지름이1 지름이 2일 경우이다. ㅠㅠ
삼각함수도 반지름이 1일경우로 원을 그려 생각하면 엄청 쉬움
cosθ+sinθ=1 이게 원을 뜻한다.
x*x+y*y=1 도 원이지만.
[네이버 지식백과]라디안[Radian] (물리학백과)
A.3 좌표에서 각도 구하기
플레이어의 애니메이션을 선택하기 위해 플레이어의 이동각도를 알아야 할 때가 있습니다.
플레이어가 점 p1에서 p2로 이동할때 각도는 다음과 같습니다.
float dx = p2.x - p1.x;
float dy = p2.y - p1.y;
float angle = Mathf.Atan2(dy,dx)*Mathf.Rad2Deg;
Atan2는 좌표를 입력하면 각도를 구해주는 함수입니다.
A.4 자주쓰는 삼각함수 메서드
특정 게임 오브젝트 추적하기
Vector2 GetToVector(Vector2 pos) {
float dx = pos.x-transform.position.x;
float dy = pos.y-transform.position.y;
float rad = Mathf.Atan2(dy,dx);
//벡터만들기
float x = Mathf.Cos(rad);
float y = Mathf.Sin(rad);
Vector2 v = new Vector2(x,y); //방향
return v;
}
특정 게임 오브젝트를 향하도록 회전시키기
GetAngle(Vector2 from, Vector2 to) {
float dx = to.x-from.x;
float dy = to.y-from.y;
float rad = Mathf.Atan2(dy,dx);
return rad * Mathf.Rad2Deg;
}
위함수를 Update()에서 호출해서 게임오브젝트을 로테이션 시킵니다.
Update(){
float angle = GetAngle(transform.position, 이동 위치의 position);
transform.rotation = Quaternion.Euler(0,0,angle);
}
다음 메소드는 이동속도를 회전각도로 반환합니다.
float velocityToAngle(){
float r = 0;
Rigidbody2D body = GetComponent<Rigidbody2D>();
if(body !=null) {
Vector2 v = body.velocity;
r = Mathf.Atan2(v.y, v.x) * Mathf.Rad2Deg;
}
retur r;
}
Update()에서 다음같이 사용됩니다.
Update() {
float angle = velocityToAngle();
transform.rotation = Quaternion.Euler(0,0,angle);
}