-
카메라(Camera)유니티 2022. 2. 4. 15:35
1. 카메라 컴포넌트
Culling Mask : 카메라에 투영할 레이어를 설정
Field of View : 카메라가 투영할 범위
Clipping Planes-Near : 카메라에서 가장 가까운 물체가 보이는 최소거리
Clipping Planes-Far : 카메라에서 가장 먼 물체가 보이는 최대거리
나머지는 유니티 문서 참조
2. 카메라 컨트롤러
카메라를 플레이어에 귀속시키기 위해서는 카메라를 플레이어의 자식객체로 만드는 방법이 있다.
하지만 그렇게하면 플레이어가 회전을 할 때 카메라도 너무 어지롭게 회전하기 때문에 CameraController스크립트를 통해 카메라의 움직임을 플레이어에 귀속시켜보자.
Define.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Define { public enum CameraMode // 카메라의 뷰 모드를 열거형으로 표시 { QuaterView, } }
CameraController.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraController : MonoBehaviour { [SerializeField] Define.CameraMode _mode = Define.CameraMode.QuaterView; // 뷰 모드 설정 [SerializeField] Vector3 _delta = new Vector3(0.0f, 6.0f, -5.0f); // 카메라 위치 [SerializeField] GameObject _player = null; // 플레이어 void LateUpdate() // 카메라 떨림 현상을 제거하기 위해사용 { if(_mode == Define.CameraMode.QuaterView) { transform.position = _player.transform.position + _delta; // 카메라 위치를 플레이어에 귀속 transform.LookAt(_player.transform); // 카메라는 플레이어 위치를 바라봄 } } }
LateUpdate를 사용하는 이유는 Update에서 처리하면 카메라 이동과 플레이어 이동의 순서가 뒤죽박죽이 된다. 그래서 매 프레임마다 2분의 1확률로 먼저 실행되는 코드가 달라지기 때문에 카메라 떨림현상이 발생한다.
이러한 현상을 바로잡기 위해서 순서를 정해주면 되는데 플레이어 이동이 먼저 실행된 후 카메라 이동이 실행되게 하기 위해 LateUpdate에서 카메라 이동을 처리해주었다.
참고로 LateUpdate는 Update보다 나중에 실행된다.
3. 장애물을 피해 플레이어를 잡는 카메라
CameraController.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraController : MonoBehaviour { [SerializeField] Define.CameraMode _mode = Define.CameraMode.QuaterView; // 뷰 모드 설정 [SerializeField] Vector3 _delta = new Vector3(0.0f, 6.0f, -5.0f); // 카메라 위치 [SerializeField] GameObject _player = null; // 플레이어 void LateUpdate() // 카메라 떨림 현상을 제거하기 위해사용 { if(_mode == Define.CameraMode.QuaterView) { RaycastHit hit; if (Physics.Raycast(_player.transform.position, _delta, out hit, _delta.magnitude, LayerMask.GetMask("Wall"))) { // 충돌한 물체의 좌표 * 0.8만큼 카메라 위치 이동 float dist = (hit.point - _player.transform.position).magnitude * 0.8f; transform.position = _player.transform.position + _delta.normalized * dist; } else { transform.position = _player.transform.position + _delta; // 카메라 위치를 플레이어에 귀속 transform.LookAt(_player.transform); // 카메라는 플레이어 위치를 바라봄 } } } public void SetQuaterView(Vector3 delta) { _mode = Define.CameraMode.QuaterView; _delta = delta; } }
레이캐스팅을 이용하여 구현하였고 코드 분석은 주석으로 해놓았다.
'유니티' 카테고리의 다른 글
애니메이션(Animation) (0) 2022.02.04 마우스 클릭을 통한 플레이어 이동 (0) 2022.02.04 레이어(Layer) (0) 2022.02.04 Raycasting(레이캐스팅) with 유닛 클릭 (0) 2022.02.04 Collision과 Trigger (0) 2022.02.03