Jump Game

용준·2024년 3월 4일
0

Project

목록 보기
4/6

1. 플레이어

스프라이트를 분할해 애니메이션으로, 애니메이션을 애니메이터에 트랜지션을 입혀서 3가지 상태를 만들었습니다.
각 트랜지션은 Equals로 1이면 Idle 상태, 2면 Move 상태, 3이면 Falling 상태로 전환됩니다.
상태는 enum으로 관리해주었고 플레이어 강체의 Y 속도가 1보다 크고 0이 아니면 점프 키를 입력받은 것으로 Move 상태가 됩니다.
반면에 Y 속도가 -3보다 작고 0이 아니면 아무 키를 입력받지 않고 낙하하는 것으로 Fall 상태가 됩니다.
처음 enum에서 Move는 2, Fall은 3로 정해주었으니 애니메이터의 트랜지션에 원하는 값이 전송됩니다.

Ray를 사용해 Idle 상태로 전환하는 코드입니다. Ray나 충돌 관련 코드는 FixedUpdate에서 다루는 것이 좋다고 합니다.

플레이어의 중심으로부터 아래로 향하는 1.0f 길이의 Ray를 발사하여 닿은 오브젝트가 Null이 아니면서 Ray의 길이가 0.7f보다 작다면 바닥에 닿고있다는 것으로 판단하여 Idle 상태가 됩니다.

벽이나 데드존에 닿으면 게임을 재시작하게 되는 충돌 처리 코드입니다.
플레이어의 좌표를 리셋, 스코어를 초기화, 설치된 벽들을 파괴합니다.
AudioSource를 사용해 SFX를 재생시켰습니다.

플레이어는 강체의 Velocity 값에 플레이어의 점프 파워만큼 y값을 증가시켜 위로 날아오를 수 있습니다.
AudioSource를 사용해 SFX를 재생시켰습니다.


2. 구성요소

2.1. 장애물

벽마다 스코어 패드의 간격과 이동 속도가 다릅니다.

Range 속성을 사용해 인스펙터 창에서 직접 속도를 할당할 수 있어서 관리가 편했습니다.

총 4종류의 벽을 만들고 프리팹으로 등록했습니다.

만든 벽은 WallManager 클래스에서 배열로 받아와 생성시킬 것입니다.

먼저 WallGenerator(벽 생성 관리)입니다.
3초 주기로 SpawnWall(벽 소환) 함수를 실행합니다.

SpawnWall 함수는 현재 게임 스코어를 받아와서 해당 스코어에 따라 다양한 종류의 벽을 생성하는 역할을 합니다.

각 벽이 동일한 위치에 생성되지 않도록하기 위해 -3.0에서 3.0까지의 랜덤한 값을 오프셋으로 활용합니다.

벽이 생성되면 해당 벽은 이동하게 되며, 12초 후에는 자동으로 사라지며, 이때 tick 값은 0으로 초기화됩니다.

게임의 주된 루프는 외부에서 실행되는 WallGenerator 함수에 의해 조절됩니다.

매 3초마다 해당 함수가 호출되면 내부에서는 SpawnWall 함수를 실행하게 되어 벽의 생성과 함께 tick 값이 초기화됩니다.

다형성을 고려해서 코드를 만든다면 유지보수에 용이할 것 같습니다.


2.2. 배경


MoveTowards 함수를 사용해 현재 위치에서 목적지까지 이동하는 새(Bird) 오브젝트입니다.

매 번 같은 목적지에 도달하지 않도록 새가 목적지에 한 번 도착하면 10초 주기로 위치를 시작점으로 초기화하고 다음 목적지까지 Y값을 랜덤하게 변경시켜 다시 재생을 합니다.


3. 시스템

3.1. 스코어

Player 클래스에서 플레이어가 스코어 패드에 닿으면 ScoreData가 상승하게 되는데,
ScoreData는 이 곳 GameManager 클래스에서 관리됩니다. 현재점수가 최고점수보다 높으면 최고점수를 현재점수로 옮겨주는 작업을 합니다.


3.2. 사운드

AudioManager에선 BGM과 SFX 두가지 종류의 사운드 클립을 관리합니다. 작동 원리는 다음과 같습니다.

하이라이키 창의 AudioManager 오브젝트에 자식 객체로 bgmObject와 sfxObject를 생성합니다.
모두 AudioSource 컴포넌트를 입혀준 뒤 인스펙터 창에서 할 수있는 설정을 이곳에서 사전 설정합니다.

배경음 같은 경우 loop(반복재생)를 켜두고,
볼륨과 클립은 헤더 속성을 통해 인스펙터 창에서 조절할 수 있게 하였습니다.

PlaySfx 함수는 여러 SFX를 동시에 재생할 수 있도록 구현한 코드입니다.

for문 루프로 모든 오디오 소스를 확인하여 빈 오디오 소스를 찾습니다.
빈 오디오 소스를 찾으면 해당 오디오 소스에 Sfx에 해당하는 오디오 클립을 재생시킵니다.
비어있는 오디오 소스를 찾으면 루프를 종료합니다.

즉, 오디오 소스 중 재생되지 않는 것을 찾아서 해당 소스에 지정한 사운드 효과를 재생하고,
오디오 소스가 재생 중이라면 아무 작업도 수행하지 않는 코드입니다.

오디오 소스를 많이 사용해보지 않아서 겉핥기 느낌을 많이 받았습니다. 나중에 오디오 소스와 오디오 클립 관련해서는 추가적으로 학습을 해야할 것 같습니다.


3. 마치며

velog는 영상 첨부가 불가능하여 이 곳에 들어가면 확인할 수 있습니다.

0개의 댓글

관련 채용 정보