반응형
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. 2. 4. 16:38
반응형

이전에 올린 벽돌 부수기, 물음표 상자, 몬스터들 기능 외에

기본적으로 슈퍼마리오 게임이라면 상징적인 움직임같은 것들이 있어요.

 

예를 들면, 슈퍼마리오가 죽을 때 노래와 함께 위로 올라갔다가 화면아래로 빠르게 떨어지는 움직임 같은것들요.

 

이런 동작들이 생각보다 귀찮게하는 오류들이 많았어요.

 


마리오 사망모션

영상을 gif로 변환해서 올리는 법을 알아내서 올릴 수 있게 되었어요.

소리는 재생이 안되지만, 마리오가 죽을 때 그 죽었을때 노래가 나옵니다.

 

여기서 포인트는 마리오가 죽자마자 튀어오르는게 아니라, 1초정도 지연하고 나서 튀어오른다는 겁니다.

 

그리고, 플레이어가 죽었을때나 승리했을 때 조작이 불가능하도록 하려고 공통적으로 추가한 부분이있는데

플레이어의 위치를 조작에 따라 변경해주는 메소드의 맨 위에

플레이어가 죽었거나 승리했다면 조작이 불가능하도록 조건문을 넣었습니다.

 

PlayerController 스크립트

플레이어 움직임을 관할하는 스크립트에요.

 

if문 부분은 몬스터를 죽이는 코드였고, 이번에 볼 부분은 버섯을 성공적으로 밟지 못하고 충돌했을 때를 말하는

else부분 입니다.

 

우선, dieSound라는 오디오클립을 재생했어요. 마리오가 죽었을 때 재생되는 노래에요. 이때, 배경음악을 멈춥니다.

이 스크립트는 카메라에 넣어놓은 스크립트에요. BGM은 카메라에서 재생하게 했기 때문입니다.

 

다시 플레이어로 돌아와 아래 애니메이션을 정지해줘요.

원래는 사망 애니메이션이 있다면 해당 애니메이션으로 전환해야하겠지만

마리오 사망애니메이션을 구하지 못했어요 ㅠㅠ..

 

그리고 코루틴을 실행하는데, 코루틴은 어떤 코드를 실행함에 있어 지연시간을 주고싶을 때 사용해요.

 

코루틴을 사용하고싶다면 해당 메소드는 IEnumerator라고 선언해야 합니다.

코루틴을 위한 IEnumerator

yield return new WaitForSeconds(1f) 라인을 보면 대충

WaitForSeconds의 인자만큼 지연시킨 뒤 실행하라는 느낌이죠..

 

1초 뒤에 playerRigidboy의 y축으로 1500f의 힘을 주고, 중력의 스케일을 8로 줘요.

점프할때보다 빨리 떨어져야 진짜 슈퍼마리오 같기때문에 저렇게 했어요.

 

그리고 땅바닥 아래로 꺼져야 하기 때문에 Collider2D를 불가능하게 해줘요. .enabled를 통해서

 

마지막으로 Invoke라는 메소드가 또 있는데, 코루틴과 비슷한 역할이에요.

첫번째인자의 이름을 가진 메소드를 두번째 인자만큼 지연시킨 뒤 실행해요.

 

 

게임오버 메소드는 단순히 씬을 게임오버 씬으로 옮깁니다.

 

여기까지가 마리오의 사망을 처리하는 코드입니다.

 

다음은 맵 끝까지 가서, 깃발에 닿으면 게임을 승리하는 과정을 구현했습니다.

 


승리했을때

제가 걸어간거 아니에요.. 깃발에 닿으면 알아서 성으로 걸어갑니다.

깃발도 이미지가 없어서 그냥 버섯을 길게 늘어뜨렸습니다. ㅜㅜ

 

이걸 구현할때는 애먹었던 부분이 몇군데 있습니다.

 

우선, 보다시피 깃발(버섯)에 닿았을떄, 천천히 떨어져야합니다.

다시한번 플레이어 스크립트인데요, 우선 Flag라는 태그를 가진 오브젝트와 충돌했는지를 판단해줍니다.

 

맞다면 isWin을 true로 해주고, playerRigidbody의 x축에 -5의 힘을 준 이유는,

튕겨 나가지않고 아래로만 쭉 떨어지게 하도록 하기 위해서였어요.

천천히 떨어지기 위해 중력을 0.5로 설정했구요.

 

그리고, 깃발을 통과해서 지나가야하기 때문에, 깃발의 collider를 비활성화합니다.

그 후에 다시 코루틴을 통해 플레이어가 성까지 걸어가게 합니다.

WinWalk에 collision을 인자로 전달하는건 빼도 됩니다. 수정하다 말고 캡처해서 남아있네요.

 

1초 후에 걷는 애니메이션을 실행하고 5초후에는 게임오버씬으로 가도록 했습니다.

 

오른쪽으로 걷는 메소드의 실행은 Update에서 직접 했습니다.

게임의 성능에 마이너스 요인일 것 같은데 구현이 잘 안되는 바람에 해버렸습니다..

 

플레이어가 승리했다면 오른쪽으로 걸어가도록 한거에요.

조금 깔끔하지 못한 코드같긴합니다...

 

우선, 여기까지가 슈퍼마리오의 기본기능 구현이에요.

 

gif로 기능들을 쭉 봐볼게요.

시연 영상

 

반응형