본문 바로가기
유니티 일기

유니티 일기 ( 메인카메라 CamRotate )

by 아이론느 2021. 10. 20.

유니티의 인풋 매니저 (CamRotate 활용 코딩)

 

유니티는 인풋매니저를 통해  자주 쓰이는 입력값들이 설정되어 있습니다.

 

아래 코드는 input 클래스의 GetAxis() 함수를 이용하여 마우스 입력을 받는 코드입니다.

 

void update()

{

    //사용자의 마우스 입력을 받아 물체를 회전시키고 싶다.

    //1. 마우스 입력을 받는다.

    float mouse_X = Input.GetAxis("Mouse X")

    float mouse_Y = Input.GetAxis("Mouse Y")

  

   //2. 마우스 입력 값을 이용하여 회전 방향을 결정한다. (Vector3 활용)

   Vector3 dir = new Vector3(-mouse_y, mouse_x, 0);

}

 

회전축은 물체를 좌우로 회전시키고 싶다면 = y축

물체를 상하로 회전시키고 싶다면 = x축이 기준입니다.

 

x축 회전(mouse_y)의 경우 양수 방향으로 회전 시 아래쪽으로 회전하고

음수방향으로 회전 시 위쪽으로 회전하기 때문에 마우스 상하 입력 값을 반대로 적용해야 합니다. 

 

해당 코드는 fps 게임 등에서 카메라에 붙이는 C# 코드로 활용될 수 있습니다.

 

해당 입력 코드에서 사람의 시선을 감안하여 상 하 회전 갑승ㄹ -90 ~ 90도 사이로 제한합니다.

Mathf 클래스의 Clamp() 함수를 사용합니다.

 

void update()

{

    //사용자의 마우스 입력을 받아 물체를 회전시키고 싶다.

    //1. 마우스 입력을 받는다.

    float mouse_X = Input.GetAxis("Mouse X")

    float mouse_Y = Input.GetAxis("Mouse Y")

  

   //2. 마우스 입력 값을 이용하여 회전 방향을 결정한다. (Vector3 활용)

   Vector3 dir = new Vector3(-mouse_y, mouse_x, 0);

 

   //3. 회전 방향으로 물체를 회전시킨다.

   //r = r0+ vt

   //+ = <- 이 구문은 전의 구문을 = 뒤에 더해준다는 뜻임.

   // transform.eulerAngles = transform.eulerAngles + dir * rotSpeed * Time.deltaTime;

 

   transform.eulerAngles += dir * rotSpeed * Time.deltaTime;

 

    //4. x축 회전(상하 회전) 값을 -90 ~ 90도 사이로 제한한다.

   Vector3 rot = transform.eulerAngles;

   rot.x = Mathf.Clamp(rot.x, -90f, 90f)

   transform.eulerAngles = rot;

}

 

이렇게 코드 작업을 진행하면 자꾸만 카메라가 고개를 아래로 수그립니다. 이것은 유니티 Transform 컴포넌트의 특징 때문입니다. 내부적으로 각도를 0~360도로 처리하기 위해 0도 보다 작아지면 -1도가 아닌 359도로 자동 연산해주기 때문에  90도를 넘은 것으로 확인되어 작성한 코드에 따라 90도로 변환되면서 자꾸만 바닥을 내려다 볼 것입니다.

 

이 부분은 유니티 내부에서 자동으로 각도를 변환하기 전에 미리 -90~90도로 제한하는 코드를 적용하면 문제가 해결됩니다.

 

public class CamRotate : MonoBehaviour

 

  //회전 속도 변수

  public float rotSpeed = 200f;

  

  //회전 값 변수

  float mx = 0;

  float my = 0;

 

   void update()

   {

    //사용자의 마우스 입력을 받아 물체를 회전시키고 싶다.

    //1. 마우스 입력을 받는다.

    float mouse_X = Input.GetAxis("Mouse X")

    float mouse_Y = Input.GetAxis("Mouse Y")

 

   //1-1. 회전 값 변수에 마우스 입력 값만큼 미리 누적시킨다

   mx += mouse_X * rotSpeed * Time.deltaTime;

   my += mouse_Y * rotSpeed * Time.deltaTime;

 

   //1-2. 마우스 상하 이동 회전 변수(my)의 값을 -90 ~ 90도 사이로 제한한다.

   my = Mathf.Clamp(my, -90f, 90f);

     

   //2. 회전 방향으로 물체를 회전시킨다.

   //r = r0+ vt

    transform.eulerAngles = new Vector3(-my, mx, 0);

   }

}

 

메인카메라에 드래그 하여 스크립트를 넣어주면 마우스 이동방향에 따라 캠이 회전 하는 것을 볼 수 있습니다.

'유니티 일기' 카테고리의 다른 글

유니티의 정규화 벡터 2탄 nomalized  (0) 2021.10.25
유니티의 정규화 벡터  (1) 2021.10.23
유니티 이벤트 함수의 호출 순서  (0) 2021.10.23
절대강좌 fps 예제 시작!  (0) 2021.10.21
bitbucket 사용방법  (0) 2021.10.21

댓글