어제와 똑같이 오브젝트 회전이 더 부드럽게 하기 위해 여러 방법을 찾아보았다.
그중 참고할 만한 유튜브 영상 두개를 참고했다.
1번참고 , 2번참고
해당 영상을 참고 하던 중 시네마머신 버츄얼 카메라를 통해 오브젝트 회전 및 좀 더 게임 요소가 있게 할 수 있기에 참고하려 했지만 그전에 내가 원한건 오브젝트 회전이기에 우선 해당 작업을 한 후 시네마머신을 좀 더 파보기로 했다.
밑에는 기존 코드와 변경 된 코드 내용 중 일부다.
기존 코드
void Update()
{
if (mouseDown)
{
float deltaX = Input.mousePosition.x - lastMousePosition.x;
//마우스 x축 위치 변화량 계산 후 마우스 위치 x좌표에서 직전 마우스 위치 x좌표를 뺀다
float deltaY = Input.mousePosition.y - lastMousePosition.y;
//계산된 변화량과 회전 속도를 곱하여 y축 기준으로 오브젝트를 회전시킨다.
objectToRotate.Rotate(Vector3.up * deltaX * rotationSpeed, Space.World);
// x축회전을 제한적으로 사용하여 사용불편을 방지한다.
objectToRotate.Rotate(Vector3.right * deltaY * rotationSpeed, Space.World);
}
if (Input.GetMouseButtonDown(0)) //마우스 버튼을 누른 순간
{
lastMousePosition = Input.mousePosition; //현재 마우스 위치 저장
mouseDown = true;
}
else if (Input.GetMouseButtonUp(0)) // 마우스 버튼이 눌러진 상태에서 떼어진 상태로 변환되면
{
mouseDown = false;
}
}
우선 기존 코드의 장점이라고는 없다.
지금 보니 왜 내가 이런 무식한 코드를 만든거지 싶다.
1.우선 회전속도를 조절하기 어렵다.
2. 굳이 기존 마우스 위치에서 이동한 마우스 위치를 계산 할 필요가 있을까? 이게 더 복잡하다고 생각한다.
변경 후 코드
void Update()
{
if (isRotating)
{
// rooty와 rootx 값 갱신한다
// Input.GetAxis 상대적인 마우스의 움직임을 얻으며
// 각 움직임 값에 회전속도 변수를 곱한 후 델타 타임으로 보정하여 갱신한다.
rooty += Input.GetAxis("Mouse Y") * speedy * Time.deltaTime;
rootx += Input.GetAxis("Mouse X") * speedx * Time.deltaTime;
rooty = Mathf.Clamp(rooty, -360, 360);
//// Mathf.Clamp 함수를 사용하여 rooty 값이 -360 이하 또는 360 이상이 되지 않도록 제한합니다.
// 오브젝트의 회전값(eulerAngles)을 설정합니다. x, y 축 회전값은 rooty와 -rootx로 설정하고 z축 회전은 없도록 0으로 설정합니다.
objectToRotate.eulerAngles = new Vector3(rooty, -rootx, 0);
}
if (Input.GetMouseButtonDown(0) && !isRotating)
{
Debug.Log("마우스 왼쪽 버튼을 누르면 회전을 시작합니다.");
isRotating = true;
mouseReference = Input.mousePosition;
}
else if (Input.GetMouseButtonUp(0) && isRotating)
{
isRotating = false;
}
}
주석으로도 달아 두었지만 여기서 핵심은
상대적인 마우스 움직임을 통해 회전 속도를 기록할 수 있다.
eulerAngles를 사용하므로, 각도 값을 직접 계산할 필요가 없습니다.
또한 -360 , 360 이상이 되지 않도로 제한한 이유는 굳이 그 이상으로 갈 필요 없을 회전값이 무제한 증가되면 연산 속도와 메모리 낭비가 되기 때문이다.
코드 속 개념
Mathf.Clamp() 함수는 주어진 값을 지정된 최솟값과 최댓값 사이로 제한하는 데 사용되는 Unity의 내장 함수
eulerAngles는 Unity에서 사용되는 오일러 각도(Euler angles)입니다. 오일러 각도는 3차원 회전을 표현하는 방법 중 하나로, 3개의 각도 값(x, y, z)을 사용하여 각 축에 대한 회전을 나타냅니다
변경된 코드를 통하여 자연스러운 회전을 만들어 냈으며 이후 적용해보니 정상 작동이 되었다.
이후에는 이 기능을 어떻게 실행시킬지에 관한 내용을 적도록 하겠다.