게임 개발 과정에서 수시로 추가되고 수정이 빈번한 사운드 resource 같은 경우 처음부터 다수의 자원을 효과적으로 다룰 관리방법이 중요하다

모바일 포트폴리오 정도를 다루는 간소한 프로젝트에서는 리소스가 많아봐야 100개를 넘을리 없지만 실제 대규모 프로젝트에서는 그보다 훨씬

많은 분량을 고려해야하기 때문에 사운드 리소스를 식별하는 해시맵을 작성해야 할 것이다. 


지금 프로젝트에서는 그와 유사한 개념으로 유니티 친화적인 scriptableObject를 사용하여 사운드 타입을 BGM과 UI, SFX 별로 구별하였습니다.

확장메서드로 enumType을 인덱스화하면 오디오메니저에서 식별할 수 있는 타입을 인자로 받아 사운드를 재생하고 관리되도록 설계하였습니다.


오디오매니저에는 Volume Fade In/Out을 구현하여 씬 시작시 필요한 부분에서 부드러운 사운드 전환을 연출할 수 있도록 하였고, 

게임 pause Canvas를 열 때 Backgroud music 에 대해서만 중지 속성값을 주어 보다 자연스러운 UI 반응 구성하도록 하였습니다.




Sound.source


toggle code

SoundSource - ScriptableObject


toggle code - BGM / SFX / UI


toggle code - None 예외 처리 사용 이유


Sound.AuidoManager


toggle code

AudioManger - 사운드 관리 매니저 클래스 (사운드 타입 접근 인덱스화, 볼륨 Fade in /out 구현)

musicSource(BGM)와 soundSource(SFX , UI) 구분 -  SoundSource pause Ignore // pause canvas 활성화 시 BGM만 pause






캔버스의 형태는 단순한 이미지 요소의 집합체가 아닌 씬의 흐름과 그 맥락을 같이하며, 이미지 속성이 일종의 정보 역할을 하는 그룹화된 객체 영역이기도 합니다. 이것은 공통된 방법으로 손쉽게 꺼내쓰고 언제든 재활용할 수단이 제공되어야 함을 말합니다.

이것에 가장 알맞은 자료구조는 Stack이라고 생각하여 UI Canvas 구조를 Stack을 활용해 설계하였습니다.


미리 참조된 Canvas List로부터 해당하는 Canvas를 찾아야 할 때 (for문이나 foreach문을 사용해 순회하지 않고) index로 바로 접근하는 게 최적화 측면에서 유리하다고 생각하기에 Stack에 저장되고 식별하는 정보로 클래스 참조가 아닌 Canvas들에 부여된 고유 식별 인덱스 넘버(int 자료형)를 사용했습니다.


CanvasManager에서 canvas 객체들은 인스턴스되고 초기화 이후, 참조 리스트에 enumType에서 지정한 순서대로 재정렬됩니다. 

(Linq와  Extension메서드 사용)  

유니티 에디터 상에서 순서없이 프리팹을 리스트에 넣어도 실행이후 Type 순서에 맞게 정렬이 되고 검색 후 매칭에서 올바르게 작동하도록 합니다.

(작업 내용이 변경되거나 추가될 경우 보다 유연하게 대처할 수 있고 협업에 어울리는 방식이라고 생각했습니다.)


또한 캔버스들은 On/Off 시키는 과정이 매번 빈번하게 일어나므로 최적화를 위해 하나의 캔버스가 켜질 때 다른 모든 캔버스를 꺼지게 하는 방법은 

(모든 오브젝트를 순회하여 일일이 gameObject.SetActive(false);하는 게 아닌) deligate Event로 처리하였습니다.

즉 하나의 캔버스가 새롭게 켜지는 과정에서 다른 캔버스가 enable 되어 있다면 그 당사자만이 이벤트를 듣고 이후 스스로  disable 상태가 됩니다. 


Canvas panel 내부 이미지 버튼에 대한 인터렉션은 에디터 상에서 메서드와 직접적으로 연결시키지 않고 버튼 필드와의 연결점만 열어놓았습니다.

_playButton.onClick.AddListener(() => OnClickPlay());  이후 이와 같은 방식으로 실제 구현에 대한 정보는 스크립트를 통해 알 수 있도록 하였는데

이것은 버튼과 관련한 메서드 내용에 대해 리펙토링을 쉽게 하고 스크립트를 확인했을 때 정보에 대한 가독성을 높일 수 있다고 생각합니다.


* UI 파트 최적화 (모바일 빌드 후 테스트해보니 발열이 엄청 심하다)  

UGUI Text -> Unity 2018에 기본 플러그인으로 들어온 TextMeshPro로 전환 , string.Format() 사용

UI sprite -> packing Tag 꼭 지정해줄 것 , Mip Maps 설정 해제  등 


UserInterface.Cnavas


toggle code

CanvasUI - UI Canvas의 부모 클래스 


toggle code

CanvasManager - canvas stack 자료구조로 관리


toggle code

LobbyCanvas - 메인메뉴 캔버스 


toggle code

OptionCanvas- 유저 게임 옵션 세팅 캔버스


toggle code

ScoreCanvas - 유저 점수와 리더보드 디스플레이 캔버스


toggle code

PlayCanvas - 게임 플레이 씬 HUD 정보 디스플레이 캔버스


toggle code

Pause - 게임 일시 정지 캔버스


toggle code

Success - 스테이지 클리어 후 미션 성공  디스플레이 캔버스


toggle code

ClearedCanvas - SuccessCanvas의 부모



Scene.level Mangement


toggle code

LevelSceneManager - 게임의 Scene Load 와 종료를 담당 / 모든 씬 로드는 Fade Animation 효과를 주기 위해 코루틴 메서드 안에서 동작합니다.





GameLevelManager.levelProperty 와 레벨 아이템 로드


VertexBlock.충돌 체크 옵저버

+ Recent posts