반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Unwound Developer

유니티 - 슈퍼마리오 카메라 본문

Unity/Unity, C#

유니티 - 슈퍼마리오 카메라

unwind 2022. 1. 28. 16:18
반응형

첫번째 클론으로 슈퍼마리오를 선택했는데, 생각보다 어려웠습니다.

일단 시작하자마자 슈퍼마리오 특유의 카메라 시점부터 막혔어요..

도움받을 곳을 찾아본 결과로 외국인 유튜버의 설명을 보면서 따라했는데, 뭔가 이상했어요.

 

카메라 무빙 부분은 괜찮았는데, 캐릭터와 적 AI를 구현할 때,

유니티에서 제공하는 Collider, RigidBody이런 기능을 놔두고 레이캐스트를 이용해서 비효율적으로 하는 것 같더라구요.

레이캐스트를 이용해서 오브젝트간의 상호작용을 관리하는게 더 수준 높은 방법인건가요..?

 

어쨌든 저는 다 따라해놓고 맘에 안들어서, 전부 갈아엎느라 시간을 많이 쓴 것 같네요.

 


우선 카메라 무빙을 제어하는 CameraFollow 스크립트입니다.

CameraFollow 스크립트의 변수

슈퍼마리오의 카메라 무빙을 생각해봐요.

 

항상 캐릭터가 중심이긴 하지만, 맵의 양쪽 끝에서는 카메라가 캐릭터를 중심으로 두지 않아요.

스테이지의 왼쪽 끝에서

이렇게 한쪽이 스테이지의 끝이라면 그 방향으로 더이상 카메라가 넘어가지 않아요.

평상시 카메라의 모습

캐릭터가 맵의 끝에 위치해있지 않다면, 이렇게 항상 캐릭터 중심으로 카메라가 움직이구요.

이렇게 왼쪽에 벽을 길게 세워놓고 저기를 카메라가 안보여주면 그만이죠.

그럼 저쪽이 더 이상 진행할 수 없는 맵의 끝이 되는거에요.

저 길다란 벽이 leftBound와 rightBound에요.

levelMinX와 levelMaxX가 딱 Bound앞까지만 카메라가 비출수 있도록하는 값이에요.

왼쪽을 기준으로 얘기해보자면,

1번이 leftBound.position.x가 됩니다.

여기서 leftBoundWidth를 왜 더하는것이냐면요.. 이거때문에 시간낭비를 많이했는데..

우선, leftBoundWidth의 선언 부분을 보면 leftBound의 가로길이 / 2를 할당해놓았어요.

leftBound의 x좌표는 leftBound의 가장 왼쪽부분이 아니라 정 가운데가 됩니다.

leftBounds.position.x라고 하면 1번 막대기의 가운데 부분의 x좌표 가 됩니다.

여기서 leftBound의 가로길이/2 를 더하면 3번. 즉, 딱 leftBound의 오른쪽 모서리까지가 되는거에요.

 

그 좌표에서 카메라의 가로길이/2, camWidth/2 를 더하게 된다면 카메라가 캐릭터를 향해 더 따라오지 않고,

저기까지만 따라오는거죠.

 

좌우로 levelMinX와 levelMaxX를 두고, 계속 캐릭터를 따라오게 하는 Update메소드입니다.

smoothDampTime은 카메라가 좀 부드럽게 쫓아오게 하는 거에요.

 

카메라는 이게 다에요.

써놓고 보니까 간단하네요...

반응형