본문 바로가기

유니티 ML Agents/유니티 기초

5. 유니티 카메라 제어

 카메라 위치 변경


카메라 위치 제어


게임을 실행했을 때 화면이 너무 옆으로 누워 있다는 것을 느낄 수 있었을 것이다. 그리고 일반적인 게임에서는 플레이어가 움직임에 따라 카메라가 플레이어를 따라 가지만 이 게임에서는 카메라가 고정되어 있다. 먼저 카메라 위치를 보기 좋게 바꾼 다음에 카메라가 공의 움직임을 따라 가도록 변경해 보자. 카메라 위치를 변경하는 방법은 두 가지인데 먼저 씬 뷰에서 카메라를 선택하고 움직이면서 위치를 설정할 수 있다. 두 번째로 카메라 객체 인스펙터 뷰에서 Transform 컴포넌트의 Position 속성을 변경하면서 카메라 위치를 바꿀 수 있다. 카메라 객체를 선택하면 씬 뷰 우측 하단에 게임 뷰 미니 화면이 나오는데 그 화면을 참고해서 카메라를 적절하게 조절해 보자.

 

카메라 제어 스크립트


카메라 제어 스크립트 개념


카메라 제어를 적절하게 하지 않으면 플레이어와 카메라가 따로 돌아가게 된다. 게임의 중심은 항상 플레이어이기 때문에 항상 카메라는 플레이어를 따라가야 한다. 앞으로 플레이어가 이동함에 따라 자동으로 카메라가 따라가서 사용자의 시선에서 공이 멀어지지 않도록 제어하는 방법을 알아보도록 하겠다.


카메라 제어 스크립트 파일 만들기


카메라 제어를 위한 C# 스크립트를 생성해 보자. 카메라 객체의 인스펙터 뷰에서 Add Component 버튼을 클릭한 후 New Script 메뉴를 선택한다. 스크립트 이름을 CameraController로 입력한 다음에 Create and Add 버튼을 누르면 프로젝트 뷰에 스크립트가 생성된 것을 확인할 수 있다. 스크립트 파일 관리를 위해 스크립트를 그래그 앤 드랍으로 Scripts 폴더로 옮겨 놓자.


카메라 제어 스크립트 만들기


PlayerController에서 물리적 제어를 위해 FixedUpdate 함수를 사용했다. 카메라 제어를 위해서는 LateUpdate 함수를 사용한다. LateUpdate 함수는 Update 함수의 모든 동작이 완료된 다음에 호출되는 함수로 모든 게임 로직 처리가 완료된 후 마지막으로 카메라 처리를 위해 쓰여진다. 물론 Update함수나 LateUpdate 함수에 카메라 제어 코드를 넣어도 동작은 하지만 복잡한 화면에서는 카메라 처리가 부자연스러울 수 있다.


(1) 카메라와 플레이어 객체를 연결하기 위해 플레이어 객체를 public 형태로 선언한다.


(2) 앞에서 설명한 바와 같이 public 형태로 선언된 변수는 스크립트를 사용하는 객체의 인스펙터 뷰에서 확인할 수 있다.


(3) 카메라 객체와 플레이어 객체를 연결하기 위해 계층 뷰에 있는 Player 객체를 드래그 앤 드랍해서 카메라 객체의 인스펙터 뷰에 있는 스크립트 player 변수 부분에 올려 놓는다.


(4) 카메라와 플레이어 간의 거리를 측정해서 offset 함수에 넣는다. 여기에서 transform.position은 카메라 객체의 위치 정보이고 player.transform.position은 플레이어 객체의 위치정보이다


(5) 프레임이 바뀔 때 마다 현재 플레이어 객체 위치정보(player.transform.position)에 카메라와의 거리를 더한 카메라 객체의 위치 정보(transform.position)에 입력한다. 즉 카메라 위치를 플레이어 객체 위치를 중심으로 보정하는 것이다.