반응형
깃허브 데스크탑으로 프로젝트 관리하기 강의 오픈!! (인프런 바로가기)
참고
→ 시네머신 튜토리얼 링크 (시네머신을 이용하여 카메라 간편하게 조작하기)
현재 보고 있는 카메라의 위치를 회전시켜보자.
즉 아래와 같이 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:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
유니티 - 게임 오브젝트 기준으로 카메라 움직이기 (0) | 2022.03.07 |
---|---|
유니티 - 1인칭 시점 조작 first person view controller (0) | 2022.03.06 |
유니티 - 선택한 블럭 이동하기 (0) | 2022.02.28 |
유니티 - 블럭 한 칸 이동하기 (그리드 기반 이동, 코루틴) (7) | 2022.02.28 |
유니티 - 오브젝트를 선택된 상태로 만들기 : (1) bool (0) | 2022.02.25 |
댓글