본문 바로가기

Unity/Unity3D

Unity3D_Week1 : 카메라 시점 변경

사용자의 마우스 움직임에 따라 카메라의 시점이 바뀌도록 설정한다.

카메라 상위에 빈 오브젝트를 두고 스크립트를 add Component하여 제어하는 것을 목표로 한다.

 

< 선언 부분>

    [SerializeField] Transform player;              // 플레이어

    [Range(0.5f, 4.0f)]
    [SerializeField] float sensitivityX;            // X축 민감도
    [Range(0.5f, 4.0f)]
    [SerializeField] float sensitivityY;            // Y축 민감도

    [SerializeField] float minX;                    // x축 회전 카메라 최소 각도
    [SerializeField] float maxX;                    // x축 회전 카메라 최대 각도

    float xRotation = 0.0f;                         // x축 회전 값.

[Range(float a, float b)] = Inspector에서 최소값 a, 최대값 b를 가지는 스크롤로 바뀐다.

Inpector상의 추가한 Script에서의 Sensitivity가 스크롤로 변한다.

<Update>

private void Update()
{
    float mouseX = Input.GetAxis("Mouse X") * sensitivityX;
    float mouseY = Input.GetAxis("Mouse Y") * sensitivityY;
    
    Vector2 mouseXY = new Vector2(mouseX, mouseY);
    
    MouseControll(mouseXY);
}

GetAxis("Mouse X/Y")를 통해 마우스 좌우 움직임을 받아주고, Scene에서 조절할 민감도를 곱해준다.

 

 

<마우스 컨트롤을 담당하는 함수 부분>

private void MouseControll(Vector2 xy)
{
    player.Rotate(Vector3.up * xy.x);
    
    xRotation = Mathf.Clamp(xRotation - xy.y, minX, maxX);
    transform.localRotation = Quaternion.Euler(xRotation, 0.0f, 0.0f);
}

마우스의 좌표는 좌 우 밖에 없으니, Vector2 xy로 인자를 받는 함수를 생성한다.

 

player.Rotate(Vector3.up * xy.x);

수평회전을 담당하는 부분.

y축 기준으로 카메라가 기준으로 하고 있는 player의 Transform을 마우스 x의 값 만큼 돌려준다.

 

xRotation

x축 로테이션은 위/아래 회전, 수직회전을 담당하는 부분.

수직회전을 하는 데 왜 xRotation - xy.y일까? 실제로 x축으로 Rotation을 시도해보면, 양수값을 대입할 수록 아래로 회전하고 음수값을 대입할 수록 위로 회전하기 때문이다. 마우스를 올리면 +값을, 내리면 -값을 전달하기 때문에 전달하는 vector2값으로 - 해주도록 한다.

 

Mathf.Clamp(대상, 최소값, 최대값)

대상의 최소값 최대값을 설정한다.

최소/최대값 없는 채로 조절하면 맥시멈없이 돌아가니 조절해준다. (+멀미방지)

 

Quaternion.Euler(x, y, z);

유니티는 사원수인 Quaternion을 사용한다. x,y,z 어느 축이든 회전하다 보면 축들이 겹치는 짐벌락 현상이 발생하는데, 컴퓨터는 이를 구분하기 위해서 x,y,z축을 제외한 w축을 가진다.

Euler은 z축 주위로 z, x축 주위로 x, y축 주위로 y 각도만큼 회전한(순서대로) Rotation을 반환해준다.

간단하게 x,y,z 회전값을 반환해준다.

 

 

'Unity > Unity3D' 카테고리의 다른 글

Unity3D_Week1 : Move(Character Controller)  (0) 2021.12.23