발사 지점에서 플레이어를 향해 레이저를 발사시키는 기능을 만드는데, 발사 지점의 position과 플레이어의 position을 받아와 발사지점에서 플레이어까지의 벡터는 구했으나, 레이저를 방향에 맞게끔 회전시키는 작업을 해 줘야 했다
아크탄젠트(atan)를 이용해서 구해야 하는 건 알았으나, 정확한 사용방법을 잘 모르겠어서 검색하다가 발견했다
https://wumbo.net/formulas/angle-between-two-vectors-2d/
레이저는 발사지점의 중앙에서 위쪽을 향하는 형태가 0도로 설정되어 있으므로, Vector2.up (0, 1)과 발사지점에서 플레이어 위치까지의 벡터를 가지고 연산을 해 주었다
Vector2 v = targetPos - mainPos;
go.transform.localRotation = Quaternion.Euler(0, 0, Mathf.Atan2(-v.x, v.y) * Mathf.Rad2Deg);
targetPos: 플레이어 위치
mainPos: 발사지점 정중앙 위치
추가로, 위 문서 링크를 발견한 스택오버플로우 질문글(https://stackoverflow.com/questions/13458992/angle-between-two-vectors-2d)에서의 답변과 내 연산이 다른 것 같아 이해가 안 되었어서 밑에 정리해 두었다
다르다고 느낀 이유는 나는 방향을 나타내는 벡터를 가지고 연산을 하려고 했고, 질문글에서는 위치를 나타내는 벡터를 가지고 연산을 하려고 한 거라 그런 거고 결국 똑같다!
v, w는 각각 벡터이다
이런 식으로 되어 있을 때, 저 세타 값을 구하기 위해
해당 공식에 각 벡터를 적용시키면 Atan2(b.Y - a.Y, b.X - a.X) 값이 나오게 된다
'Programing > Unity(C#)' 카테고리의 다른 글
[Unity] 상속 부모의 Start Awake Update메서드 실행이 안 되는 문제 (0) | 2024.09.10 |
---|---|
[Unity] Cinemachine에서 3D 카메라의 범위 설정하기(Projection: Perspective) (0) | 2024.08.07 |
[Unity] Cinemachine으로 플레이어를 따라오는 카메라 설정하기(2D, Projection: Orthographic) (0) | 2024.08.07 |
[C#] 문자 리터럴에 문자가 너무 많습니다(CS1012) (0) | 2024.07.28 |
[Unity, Spine] Spine 스킨 변경이 안 되는 문제(setSkin, setSlotsToSetupPose) (0) | 2024.06.07 |