사전캠프/TIL

2024-12-31 TIL

danpat77 2024. 12. 31. 19:18

오늘은 옛날 부터 생각했던 탑뷰 슈팅 게임을 만들기로 기획을 하였다.

시점을 탑뷰로 설정한 이유는 1인칭에 비해 탑뷰 시점이 좀더 편한한 마음으로 즐길수 있기 때문에 탑뷰 시점으로 정하게 되었다.

 

탑뷰 슈팅 게임에서 가장 중요한건 플레이어 캐릭터가 마우스 위치를 바라보면서 회전하는 기능이다.

처음 이 기능을 구연하려고 했지만 캐릭터가 마우스의 위치와 상관없이 회전하게 되어 튜터님에게 조언을 얻어 구연을 할 수 있게 되었다.

 

내가 사용했던 방법은 Vecter3 mouse =  Input.MousePosition 으로 화면 좌표에서 직접적으로 마우스 위치 가져오기 방법을 사용했었는데 튜터님은 ScreenPointToRay을 이용해 월드 좌표에서 마우스 위치를 가져와서 활용하는 것이 더 좋다는 조언을 해주시면서 예제 코드를 알려주 셨다.

ublic class ObjectRotateToMouse : MonoBehaviour
{
    public Camera mainCamera; // 카메라 참조
    public Transform targetObject; // 회전시킬 오브젝트 == 플레이어 캐릭터 오브젝트
    public float heightOffset = 0f; // 바닥에서의 고정 높이
    void Update()
    {
        if (targetObject != null && mainCamera != null)
        {
            // 마우스 위치를 월드 좌표로 변환
            Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out RaycastHit hit))
            {
                Vector3 targetPosition = hit.point;
                targetPosition.y = targetObject.position.y + heightOffset;//높이 고정
                // 오브젝트 회전 (Y축만 회전)
                Vector3 direction = targetPosition - targetObject.position;
                direction.y = 0; // Y축 회전 제한
                targetObject.rotation = Quaternion.LookRotation(direction);
            }
        }
    }
}

 

현재 마우스 위치를 월드 좌표로 변환을 하기 위해

Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);

를 사용하여  마우스 위치에서 발사된 광선을 나타내는 Ray 객체를 생성하고

 

 

if (Physics.Raycast(ray, out RaycastHit hit))

if 문을 통해 Ray 가 충돌을 했을때 Ray와 충돌한 지점을 hit.point이라고 지정한다.

 

Vector3 targetPosition = hit.point;

이렇게 구한 hit.point를 tagetPosition에 Vector3로 저장을 한다.

 

 

Vector3 direction = targetPosition - targetObject.position; direction.y = 0;

저장된 taget.Position 과 targetObject.position을 가지고 둘 사이의 백터 값을 구하고

 

targetObject.rotation = Quaternion.LookRotation(direction);

구한 백터값을 향하도록 tagetObject를 회전시킨다.

 

이렇게 해서 플레이어 캐릭터가 마우스를 따라 회전을 할 수 있게 되었다.