[ Survival Shooter 1 ] RayCast로 플레이어 캐릭터 회전하기
유니티에서 제공하는 유니티 튜토리얼 프로젝트의 Survival Shooter에서 활용된
Raycast 를 활용하여 화면 상의 마우스 방향을 구하는 테크닉이다.
슈팅 게임의 AIM 에 따른 캐릭터 회전을 구현하는데 사용된다.
핵심 코드
Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit floorHit;
if(Physics.Raycast(camRay, out floorHit, camRayLength, floorMask))
{
Vector3 playerToMouse = floorHit.point - transform.position;
playerToMouse.y = 0f;
Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
playerRigidbody.MoveRotation(newRotation);
}
코드를 이해 하기 위한 사전 지식
1. public static Camera main : Sence 의 기본 카메라를 가리키는 프로퍼티이다.
기본 카메라란 Tag 가 Main Camera 인 GameObject의 Camera Component를 의미한다. 복수의 Main Camera가 있다면 정확히 어떤 Camera가 반환되는지 정확히 알기 위해서 실험해 봤는데, 처음에는 Depth 값이 가장 작은 카메라가 Target 이라고 생각했으나
만약 Tag가 Main Camera가 복수라면, 이유는 모르겠지만 제일 최근에 생성된 Camera Component를 반환한다

Main Camera 의 Depth, Main Camera(1) 의 Depth 와 관계 없이 무조건 Main Camera(1)의 Depth 값이 반환된다. 물론 Main Camera(1)이 최근에 생성된 오브젝트이다.
public Ray Camera.ScreenPointToRay(Vector3 position) : 카메라로 부터 카메라 평면의 position 까지의 Ray를 반환한다 이 함수는 그림으로 이해하는게 더 빠른데
실행결과
카메라의 범위를 보여주는 평면의 Position 으로 Ray를 생성한다. 기준은 왼쪽 아래 (0.0) 이다. 물론 z값은 무시 된다. 코드와 실행 결과를 보면 평면의 ( 0, 0 ) 을 향하여 노란색 Ray가 생성된 것을 볼 수 있다.
Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
프로젝트 에서는 카메라 평면에서의 마우스 좌표를 향에 Ray 를 생성하게 되어 있다.
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
RayCast 함수의 원형인데, Ray 의 충돌 정보를 얻어내는 함수이다. 실제로 활용된건 아래 Parameters 이다. 프로젝트 에서는 Ray를 이용한 방향 검출을 위하여 사용 한다.
RaycastHit 는 Ray의 충돌 정보를 담기 위한 클래스이다.
프로젝트에서는 point 속성만 사용했는데, 이름에서 알 수 있듯 충돌 된 좌표를 World Space 좌표로 반환한다.
이쯤에서 벡터의 뺄셈에 대해서 알아보자
벡터 A - 벡터 B 를 하면 놀랍게도
B에서 A를 가리키는 벡터를 구할 수 있으며,
크기는 두 벡터사이의 거리다
이걸 게임에 적용하면
적 캐릭터 벡터 B - 주인공 캐릭터 벡터 A 가 된다.
다만 진행하는 프로젝트에서 객체의 방향에 y 값이 포함되어 공중을 향할 필요는 없으므로 소스코드 에서는 playerToMouse.y = 0f;
인 것이다.
그럼 이제 소스코드의
Vector3 playerToMouse = floorHit.point - transform.position;
playerToMouse.y = 0f;
를 이해 할 수 있다. 거의 다 왔다. Vector3 playerToMouse 는 말 그대로
플레이어 캐릭터 -> CamRay가 카메라 평면에 충돌하는 좌표,
마우스 움직임에 따라 Main Camera 도 움직이므로, 즉 마우스 좌표 이다.
유니티에서는 객체의 회전을 Quaternion 을 이용하여 표현한다. Quaternion 에 대한 개념은 수학 카테고리에서 따로 정리하도록 하겠다 다만 위에서 구한 방향 벡터를
Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
를 통해 회전을 위한 Quaternion 객체로 만들 수 있다는 것을 그냥 읽고 넘어가자
남은것은 public void MoveRotation (Quaternion rot); 를 통해 플레이어 객체를 회전 시키는 것이다.
Raycast 를 활용하여 화면 상의 마우스 방향을 구하는 테크닉이다.
슈팅 게임의 AIM 에 따른 캐릭터 회전을 구현하는데 사용된다.
핵심 코드
Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit floorHit;
if(Physics.Raycast(camRay, out floorHit, camRayLength, floorMask))
{
Vector3 playerToMouse = floorHit.point - transform.position;
playerToMouse.y = 0f;
Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
playerRigidbody.MoveRotation(newRotation);
}
코드를 이해 하기 위한 사전 지식
1. public static Camera main : Sence 의 기본 카메라를 가리키는 프로퍼티이다.
기본 카메라란 Tag 가 Main Camera 인 GameObject의 Camera Component를 의미한다. 복수의 Main Camera가 있다면 정확히 어떤 Camera가 반환되는지 정확히 알기 위해서 실험해 봤는데, 처음에는 Depth 값이 가장 작은 카메라가 Target 이라고 생각했으나
만약 Tag가 Main Camera가 복수라면, 이유는 모르겠지만 제일 최근에 생성된 Camera Component를 반환한다
Main Camera 의 Depth, Main Camera(1) 의 Depth 와 관계 없이 무조건 Main Camera(1)의 Depth 값이 반환된다. 물론 Main Camera(1)이 최근에 생성된 오브젝트이다.
public Ray Camera.ScreenPointToRay(Vector3 position) : 카메라로 부터 카메라 평면의 position 까지의 Ray를 반환한다 이 함수는 그림으로 이해하는게 더 빠른데
카메라의 범위를 보여주는 평면의 Position 으로 Ray를 생성한다. 기준은 왼쪽 아래 (0.0) 이다. 물론 z값은 무시 된다. 코드와 실행 결과를 보면 평면의 ( 0, 0 ) 을 향하여 노란색 Ray가 생성된 것을 볼 수 있다.
Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
프로젝트 에서는 카메라 평면에서의 마우스 좌표를 향에 Ray 를 생성하게 되어 있다.
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
RayCast 함수의 원형인데, Ray 의 충돌 정보를 얻어내는 함수이다. 실제로 활용된건 아래 Parameters 이다. 프로젝트 에서는 Ray를 이용한 방향 검출을 위하여 사용 한다.
| Ray ray | 충돌 정보를 구할 Ray |
| out RaycastHit hitInfo | 만약에 True가 반환 된다면 RaycastHit hitInfo 객체에 필요한 정보가 포함된다 |
| float maxDistance | 충돌을 검사 할 거리 |
| layerMask layerMask | 원한다면 충돌을 검출하고 싶은 layerMask를 지정하라 |
프로젝트에서는 point 속성만 사용했는데, 이름에서 알 수 있듯 충돌 된 좌표를 World Space 좌표로 반환한다.
이쯤에서 벡터의 뺄셈에 대해서 알아보자
벡터 A - 벡터 B 를 하면 놀랍게도
B에서 A를 가리키는 벡터를 구할 수 있으며,
크기는 두 벡터사이의 거리다
이걸 게임에 적용하면
적 캐릭터 벡터 B - 주인공 캐릭터 벡터 A 가 된다.
다만 진행하는 프로젝트에서 객체의 방향에 y 값이 포함되어 공중을 향할 필요는 없으므로 소스코드 에서는 playerToMouse.y = 0f;
인 것이다.
그럼 이제 소스코드의
Vector3 playerToMouse = floorHit.point - transform.position;
playerToMouse.y = 0f;
를 이해 할 수 있다. 거의 다 왔다. Vector3 playerToMouse 는 말 그대로
플레이어 캐릭터 -> CamRay가 카메라 평면에 충돌하는 좌표,
마우스 움직임에 따라 Main Camera 도 움직이므로, 즉 마우스 좌표 이다.
유니티에서는 객체의 회전을 Quaternion 을 이용하여 표현한다. Quaternion 에 대한 개념은 수학 카테고리에서 따로 정리하도록 하겠다 다만 위에서 구한 방향 벡터를
Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
를 통해 회전을 위한 Quaternion 객체로 만들 수 있다는 것을 그냥 읽고 넘어가자
남은것은 public void MoveRotation (Quaternion rot); 를 통해 플레이어 객체를 회전 시키는 것이다.