1012 마우스 가두기, 크로스헤어, 시점, 이동

null·2023년 10월 12일

Unity Study

목록 보기
21/60

1. Cursor 고정

가장 먼저 정중앙에서 커서가 벗어나지 않도록 고정시킨다.
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
Cursor.lockState

  • CursorLockMode.Confined : 플레이 화면 밖으로 커서가 나가지 않음.
  • CursorLockMode.Locked : 화면 중앙 좌표에 커서가 고정됨.
  • CursorLockMode.None : 일반적인 커서 상태.
    Cursor.visible : 커서 표시 여부 결정.

2. 화면 정중앙(크로스헤어)으로 Ray 발사하기

public Transform firePos;
Vector3 dir;
Ray ray;

void Start()
    {
    	// 총구 위치 찾기
        firePos = GameObject.Find("Muzzle").transform;
        dir = Camera.main.ScreenPointToRay(Input.mousePosition).direction;
        ray = new Ray(firePos.position, dir);
    }

Camera.main.ScreenPointToRay(Input.mousPosition)
: 카메라에서부터 현재 마우스 위치까지에 대한 Ray. 위에서 커서 고정했으므로 카메라 ~ 화면 정중앙까지에 대한 Ray라고 볼 수 있다.

ray = new Ray(firePos.position, dir)
: 위에서 구한 Ray 방향으로 총구 위치에서 시작하는 Ray 생성.

3. 마우스로 시점 이동

public class MouseMove : MonoBehaviour
{
    public float turnSpeed = 4.0f;
    public float moveSpeed = 2.0f;

    private float xRotate = 0.0f;

    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void Update()
    {
        MouseRotation();
    }

    void MouseRotation()
    {
        //// 좌우로 움직인 마우스의 이동량 * 속도에 따라 카메라가 좌우로 회전할 양 계산
        float yRotateSize = Input.GetAxis("Mouse X") * turnSpeed;
        // 현재 y축 회전값에 더한 새로운 회전각도 계산
        float yRotate = transform.eulerAngles.y + yRotateSize;
        
        // 위아래로 움직인 마우스의 이동량 * 속도에 따라 카메라가 회전할 양 계산(하늘, 바닥을 바라보는 동작)
        float xRotateSize = -Input.GetAxis("Mouse Y") * turnSpeed;
        // 위아래 회전량을 더해주지만 -45도 ~ 80도로 제한 (-45:하늘방향, 80:바닥방향)
        // Clamp 는 값의 범위를 제한하는 함수
        xRotate = Mathf.Clamp(xRotate + xRotateSize, -45, 80);
        
        // 카메라 회전량을 카메라에 반영(X, Y축만 회전)
        transform.eulerAngles = new Vector3(xRotate, yRotate, 0);
    }
}

0개의 댓글