본문 바로가기
개발/Unity

유니티 - 마우스로 카메라 회전하기 (오일러 각)

by 피로물든딸기 2022. 3. 5.
반응형

깃허브 데스크탑으로 프로젝트 관리하기 강의 오픈!! (인프런 바로가기)

 

Unity 전체 링크

 

참고

시네머신 튜토리얼 링크 (시네머신을 이용하여 카메라 간편하게 조작하기)

 

현재 보고 있는 카메라의 위치를 회전시켜보자.

즉 아래와 같이 Rotation Y (좌, 우), Rotation X (위, 아래)를 변경해야 한다.


GetAxis는 함수의 세로 또는 가로에 속하는 입력을 -1에서 1의 범위로 취득한다.

Mouse가 위로 올라갈 때 유니티 좌표계에서는 X가 바뀌기 때문에 xRotateMove에 Mouse Y가 들어간다.

xRotateMove = -Input.GetAxis("Mouse Y") * Time.deltaTime * rotateSpeed;
yRotateMove = Input.GetAxis("Mouse X") * Time.deltaTime * rotateSpeed;

 

Edit -> Preferences -> Project Settings -> Input Manager에서 Mouse X의 의미를 알 수 있다.

Sensitivity가 0.1이고, Type = Mouse Movement의 X axis가 된다.

 

회전할 값을 기존의 값에 추가한다.

yRotate = transform.eulerAngles.y + yRotateMove;
//xRotate = transform.eulerAngles.x + xRotateMove; 
xRotate = xRotate + xRotateMove;

 

위, 아래는 회전을 -90도에서 90도로만 제한한다.

이러한 제한 때문에 transform.eulerAngles.x를 사용하지 않는다.

xRotate = Mathf.Clamp(xRotate, -90, 90); // 위, 아래 고정
            
transform.eulerAngles = new Vector3(xRotate, yRotate, 0);

 

로그를 추가해서 확인해보자.

Debug.Log("euler: " + transform.eulerAngles.x + " xR: " + xRotate);

 

카메라가 아래를 볼 때는 상관없지만, 위를 볼 경우 오일러 각이 음수가 아닌, 양수 360도로 변한다.

 

X축의 이동을 -90도에서 90도로 제한해야하는데, 270 ~ 90도로 제한할 수는 없다.

따라서 xRotate는 오일러 각을 사용하지 않았다.

 

최종 코드는 아래와 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FirstPersonView : MonoBehaviour
{
    private float xRotate, yRotate, xRotateMove, yRotateMove; 
    public float rotateSpeed = 500.0f;

    void Update()
    {
        if(Input.GetMouseButton(0)) // 클릭한 경우
        {
            xRotateMove = -Input.GetAxis("Mouse Y") * Time.deltaTime * rotateSpeed;
            yRotateMove = Input.GetAxis("Mouse X") * Time.deltaTime * rotateSpeed;

            yRotate = transform.eulerAngles.y + yRotateMove;
            //xRotate = transform.eulerAngles.x + xRotateMove; 
            xRotate = xRotate + xRotateMove;
            
            xRotate = Mathf.Clamp(xRotate, -90, 90); // 위, 아래 고정
            
            transform.eulerAngles = new Vector3(xRotate, yRotate, 0);
        }
    }
}

 

Quaternion을 이용해서 rotation하는 코드는 아래와 같이 수정하면 된다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FirstPersonView : MonoBehaviour
{
    private float xRotate, yRotate, xRotateMove, yRotateMove;
    public float rotateSpeed = 500.0f;

    void Update()
    {
        if (Input.GetMouseButton(0)) // 클릭한 경우
        {
            xRotateMove = -Input.GetAxis("Mouse Y") * Time.deltaTime * rotateSpeed;;
            yRotateMove = Input.GetAxis("Mouse X") * Time.deltaTime * rotateSpeed;;

            yRotate = yRotate + yRotateMove;
            //xRotate = transform.eulerAngles.x + xRotateMove; 
            xRotate = xRotate + xRotateMove;

            xRotate = Mathf.Clamp(xRotate, -90, 90); // 위, 아래 고정

            //transform.eulerAngles = new Vector3(xRotate, yRotate, 0);

            Quaternion quat = Quaternion.Euler(new Vector3(xRotate, yRotate, 0));
            transform.rotation 
            	= Quaternion.Slerp(transform.rotation, quat, Time.deltaTime /* x speed */);
        }
    }
}

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글