5. 카메라 이동

MOON·2022년 7월 15일
0

유니티_3D_SpaceShooter

목록 보기
5/11
post-thumbnail

카메라 추적

방법 (1) : 카메라의 위치를 플레이어의 일정 거리만큼 위치 시킨다.
스크립트 작성 : FollowCam.cs
MainCamera에 연결

타겟의 위치를 연결할 변수 targetTr를 선언
Main Camera 자신을 연결할 변수 camTr를 선언
Range()는 첫 번째 인자값에서 두 번쨰 인자값까지의 범위가 된다. 거리, 높이를 선언한다.

Main Camera의 컴포넌트를 가져온다.

LateUpdate()

카메라의 이동 루틴을 LateUpdate()함수에다 쓰는 이유
LateUpdate() 함수는 Scene에 있는 모든 스크립트의 Update()함수가 완료된후 호출된다.
만약 카메라의 위치를 계산하는 로직을 Update 함수에서 구현했다면 Player의 움직임이 완료되기 전에 카메라가 이동할 경우 떨림현상이 발생할 수 있다.
따라서 카메라의 위치 계산은 Player가 이동 및 회전을 모두 끝 마친 이후에 실행해야 하므로 LateUpdate()함수에서 실행한다.

실제로 LateUpdate() 대신 Update() 로 바꾸어서 실습을 하면 떨림현상을 볼 수 있음

Transform.LookAt()
먼저 카메라를 이동 시킨 후 따라갈 대상을 향해 카메라의 각도를 회전 시킴


카메라 추적 방법

카메라가 추적할 방법은 target (Player)의 위치로부터 뒤쪽으로 dist만큼 물러서서 height만큼 높이를 올려주고 카메라를 target과 같은 각도로 회전시킨다.
구면 선형 보간 함수 (Slerp)
카메라의 부드러운 이동을 위해 Vector3.SLerp함수를 사용한다.
dampTrace 변수를 조절하면 추적하는 감도를 조정할 수 있다. (값을 Inspector 뷰에서 직접 바꿔 보도록 하자)




방법 (2) : 선형 보간(Lerp) / 구면 선형 보간(Slerp) 를 사용한 방법

Vector3.Lerp / Vector3.Slerp
Lerp/Slerp는 시작점과 끝점사이의 특정 위치의 값을 추출해 낼 때 사용. 이러한 보간 함수는 현재 값을 목표값으로 변경할 때 갑자기 변경하지 않고 부드럽게 변경 시키는 로직에 많이 활용

Lerp : 균일한 속도로 이동(회전)시킬 때 사용

Vector3.Lerp(시작값, 종료값, t)
Mathf.Lerp(시작값, 종료값, t)
Quaternion.Lerp(시작값, 종료값, t)

Slerp : 시작점과 종료점은 느리게 증가하고 중간 지점은 동일한 시간대에 이동할 거리가 커지므로 빠르게 이동(회전). 주로 회전 로직에 사용

Vector3.Slerp(시작값, 종료값, t)
Quaternion.Slerp(시작각도, 종료각도, t)

함수를 알았으면 FollowCam 스크립트를 수정하자.

변수는 첫번째 방법과 비슷하며 추가로 반응속도 damping 변수를 선언한다.

벡터 pos를 타겟 위치 + forward의 (-) 기호를 붙여 음수를 만들어 플레이어의 뒤 위치에 거리를 곱한 값 + 플레이어 보다 높게 up을 이용하여 특정 높이를 곱한다.

이런 식으로 카메라 값을 계산하여 원하는 위치에 조정한다.

여기에 Slerp() 함수를 이용하여 부드럽게 이동시킨다.
Time.deltaTime에 반응속도 변수를 곱하여 시간을 적어준다.



방법 (3) : SmoothDamp 사용

Vector3.SmoothDamp()

current : 시작위치
target : 목표 위치
currentVelocity : 현재 속도
smoothTime : 목표위치까지의 도달 시간
maxSpeed : 최대 속력 제한 값(기본값 : 무한대 Mathf.Infinity), 생락가능
deltaTime : 프레임 보장을 위한 델타 타임(기본값 : Time.deltaTime), 생략 가능

이제 FollowCam 스크립트를 수정하자.

위에서 알려준 velocity가 변수 선언하면서 나왔다.
현재 속도를 zero로 초기화 시키며 선언한다.

여기서 다른 방법과 차이점은 SmoothDamp() 함수를 사용한것이다.
인자값으로 시작 위치, 목표 위치, 현재 속도, 목표 위치까지 도달 시간으로 사용한다.


Target Offset 적용

private float targetOffset = 2.0f;

이런 식으로 변수를 선언하여 전방시야 확보에 도움을 줄 수 있다. -> LookAt좌표를 조절해서 전방 시야를 확보하도록 함

camTr.LookAt(targetTr.position + (targetTr.up * targetOffset));

이렇게 특정 오프젯을 곱하여 전방시야 확보가 가능하다.


이렇게 3가지 방법을 알아봤다. 저는 1번째 방법을 사용하여 카메라 추적을 만들었다. 원하는 방식을 선택하여 만들어보자.
profile
나만의 공간

0개의 댓글