유니티로 게임을 만들 때 유용한 시스템을 만드는 스터디이다. 기본적인 프로젝트 세팅에서부터 씬 구성, 사운드 매니저 등등을 어떻게 구성해야지 효율적으로 유지보수할 수 있는지 알아볼 수 있다. 학습은 다음의 인프런 학습 자료를 사용하였다.
유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지 강의 - 수강
수강 전 궁금한 점이 있다면? 인프런 수강 전 문의하기를 활용해 궁금한 내용을 해결할 수 있어요! - 수강 전 문의 | 인프런
www.inflearn.com
우선 첫 시간으로 프로젝트 세팅(생략), 주요 씬 설계, Title 시스템 제작에 대해 알아보았다.
1. 주요 씬 구성하기
우선 씬 구성 부분을 먼저 배워보았다.
캐주얼 게임의 경우에서는 Title, Lobby, InGame 씬으로 구성하는 것이 효율적이라고 하였다.
간단히 각 씬들을 설명하자면, Title 화면은 말 그대로 게임의 제목과 로그인 등이 이루어지는 씬, Lobby는 전반적인 게임의 아웃 게임을 나타내는 씬, InGame은 코어 게임이 이루어지는 씬에 해당한다.
실제로 내가 현업에서 작업을 하였을 때도, 해당 씬 구조로 개발이 진행되었다. 굳이 캐주얼 게임이 아니더라도 해당 구조를 가져가면 좋을 듯했다.
더 자세히 해당 씬들을 알아보자
1) Title Scene
- 게임 실행 시 무조건 가장 처음으로 실행되는 씬
- 눈에 보이지는 않지만 게임 실행에 필수적인 시스템과 주요 데이터를 로드
>> Title 씬 없이 Lobby 씬으로 넘어갈 시 로딩 단계에서 렉이 유발될 수 있다.
>> 설사 렉이 발생한다고 해도 자연스럽게 넘어갈 수 있다.
>> 실제로 현업에서 개발할 때도 해당 이슈가 버그로 올라왔던 적이 있었다. 옛날 생각이 새록새록...
>> static 성질이 강한 주요 데이터와 시스템 오브젝트를 미리 Title 씬에 로드하고 한 번에 관리할 수 있다.
2) Lobby Scene
- 게임 내 모든 콘텐츠에 접근할 수 있는 건물의 복도와 같은 곳
- 유저의 현재 진행 상황을 확인할 수 있다.
- 각 종 아웃게임 콘텐츠를 수행한다.
3) InGame Scene
- 게임의 핵심 콘텐츠가 수행되는 씬
- InGame 진입 후 유저가 플레이할 맵 또는 스테이지에 맞는 리소스를 로드한다.
- (중요!) 맵 또는 스테이지마다 InGame 성격의 신을 새로 만드는 것은 추천하지 않는다.
>> 맵마다 수정사항이 발생될 때마다 모든 씬에 접근해서 수정해줘야 하기 때문!!
>> 실제로 개인 프로젝트를 진행할 때 스테이지마다 씬을 다르게 해본 경험이 있는데, 사소한 수정이 있을 때 마다 수정해주어야 했었다... 확실히 모든 것에는 이유가 있다는 생각이 들었다.
>> 하지만 완전히 다른 성격의 게임 플레이가 진행된다면 새로운 InGame 씬을 만드는 것이 좋음
이상이다. 아주 기본적인 것 같은데 이상하게 막상 프로젝트에 들어가면 생각이 나지 않았던 것들을 잘 정리해 보니 머릿속에 콕 박혀서 너무 좋았다. 옛날 생각도 나면서, 기존에는 그냥 조금 불편하네... 하고 넘어갔던 부분을 앞으로 이렇게 수정하면 되겠다! 라는 생각이 들었다.
다음으로는 실습을 진행하였다.
실습에서는 필수적으로 필요한 일반적인 클래스에 대해 배웠다.
자세히 알아보자
1) Logger
- 로그를 통합적으로 관리해 주는 클래스
- 다음의 이유로 사용됨
>> 로그를 찍을 때 추가적인 정보, 예를 들어 타임 스탬프 같은 정보가 추가적으로 필요할 수 있다.
>> 출시 빌드 때 로그를 통합적으로 제거해 주기 위해서 사용한다.
>> 로그는 그 자체만으로도 많은 성능을 요구하기 때문에(내부적인 스택 구조도 가져옴) 이를 통합적으로 제거할 필요가 있다.
- Conditional 어트리뷰트: ProjectSettings->Player->ScriptingDefineSymbols에 특정 심벌이 정의되어 있을 때만 수행된다.
>> 이전 회사에서는 #define으로 사용하였는데, 유니티에 이런 기능을 제공하는 줄은 처음 알았다.
>> 빌드를 새로 해야 할 때마다 문자열까지 신경 써야 할 것 같아서 조금 귀찮을 수도 있겠다는 생각이 들었다.
>> ProjectSettings에서 위의 조건을 찾으면서 Log를 찍을 때 스택을 얼마나 추적할 것인지 세팅하는 조건을 찾았다.
>> 다음에는 위의 조건도 함께 사용하면 좋을 것 같다는 생각이 들었다.
2) SingletonBehavior
- 싱글톤의 성격을 가진 MonoBehavior 클래스
>> 그전에 내가 사용하던 Singleton 클래스보다 훨씬 깔끔하고 확장성 있게(Dispose, Init 함수 등) 구성되어 있어서 유익했다.
3) SceneLoader
- 특정 씬을 로드해 주는 클래스
- 다음의 이유로 사용됨
>> 씬 전환 시 초기화가 필요할 수 있음, 통합적으로 세팅 가능
>> 씬 전환 시 시간이 오래 걸릴 수 있음. 이 화면을 그대로 노출시키는 것이 아니라, 아트웍 등을 통해 가릴 수 있다. 이 처리를 여기에서 가능
>> 이전에 현업에서 작업을 할 때 씬 전환을 할 때 꽤나 애먹었던 것이 생각났다...
참고로 위의 코드 들은 다음의 나의 깃 허브에 올라와져 있다.
https://github.com/csy-59/2024_UnitySystemProgramming
GitHub - csy-59/2024_UnitySystemProgramming: 유니티 시스템 프로그래밍 스터딮
유니티 시스템 프로그래밍 스터딮. Contribute to csy-59/2024_UnitySystemProgramming development by creating an account on GitHub.
github.com
마지막으로 Title에서 Lobby 씬을 비동기 로드하여 전환하는 작업을 진행하였다.
이때 처음으로 제대로 사용해 본 AsyncOperation이 나와 한번 조사해 보았다.
1) AsyncOperation
https://docs.unity3d.com/ScriptReference/AsyncOperation.html
Unity - Scripting API: AsyncOperation
AsyncOperation class in UnityEngine / Inherits from:YieldInstruction / Implemented in:UnityEngine.CoreModule Description Asynchronous operation coroutine. Properties allowSceneActivationAllow Scenes to be activated as soon as it is ready. isDoneHas the ope
docs.unity3d.com
- 비동기 작업 코루틴이다.
- 연속적으로, 혹은 해당 작업의 완료 여부에 따라 수동으로 비동기 작업을 기다릴 수 있다.
- allowSceneActivation 프로퍼티를 통해 해당 작업이 완료된 후 바로 씬을 활성화시킬 수 있다.
- IsDone 프로퍼티를 통해 해당 작업이 완료되었는지 알 수 있다.
해당 내용들을 복습하면서 현업에서 개고생 하면서 만들었던 씬 전환 클래스들이 생각났다... 옛날 생각이 새록새록...
실제로 해당 내용을 실습해 보니...! 갑자기 씬 전환이 되지 않았다...
이유를 알아보니 내 ★어썸 ★한 컴퓨터가 너무 빨라서 whlie문에 들어가지 않았기 때문이었다... 후후...
그래서 while 이후에도 progress 가 0.9 이상일 경우 해당 처리를 해줄 수 있도록 수정해 주었다.
그러니 잘 동작하는 것을 확인할 수 있었다.
뭔가 오랜만에 이렇게 열정적으로 공부하는 것 같아서 이 스터디를 들기 다행이라는 생각이 들었다.
앞으로도 열심히 하겠다!!!
다음 내용은 다음 주에 돌아오겠다~!
'유니티 시스템 프로그래밍' 카테고리의 다른 글
유니티 시스템 스터디-5주차: 유저 인벤토리 (0) | 2024.11.26 |
---|---|
유니티 시스템 스터디-4주차: Lobby 씬 구조 및 디자인 패턴...그리고 유저 재화까 (2) | 2024.09.26 |
유니티 시스템 스터디-3주차: UI 화면 관리 시스템 (4) | 2024.09.19 |
유니티 시스템 스터디-2주차: 유저 데이터, 데이터 테이블, 오디오 (0) | 2024.09.09 |