학원, 인강등은 그냥 뭐를 선택해도 상관없다고 생각합니다. 본인 상황에 맞게 고르면 그만이라고 생각하고요. 가장 중요한건 어떤 회사를 목표 하는지 입니다. 회사를 정했으면 거기에 맞는 포트폴리오를 구성하면 됩니다. 그럼 자연스레 무엇이 필요한지 알게 됩니다.
설명 편의상, 채용을 위한 포트폴리오 목적의 탄막슈팅 게임을 만든다고 가정해봅시다.
일단 프로그래머로서 크게 생각해볼건 다음과 같습니다.
1. 플랫폼 선택 ( PC, 모바일등 )
2. 개발 엔진 선택 ( 유니티, 언리얼 ) / 로우레벨에서 DX 또는 OpenGL 부터 쌓아올릴 수도 있습니다.
3. 엔진 선택에 따른 언어 ( C#, C++ 둘중 하나겠죠. )
이제 세부적으로 보면 다음과 같습니다.
1. 게임 코드 아키텍처 및 디자인 패턴
2. 리소스 관리
3. 최적화
4. 협업을 위한 툴 관리
5. 코드 규약
6. 게임 장르에 맞는 여러가지 기법
7. 유지보수 관리
+@ 버전관리 시스템(ex: git, svn등...)
뭔가 복잡하고 어려워보이지만, 하나씩 살펴보면 간단하게 볼 수 있습니다. 번호 순서대로 설명하면 아래와 같습니다.
1. 간단하게 클래스간의 관계도로 이해해도 됩니다. 예를 들어 게임 전체를 관리하는 매니저가 있습니다. 그리고 소환되는 유닛들을 관리하는 주체도 있을 겁니다. 그리고 매니저간에 데이터를 어떻게 주고 받는지, 연결성을 어떻게 제한할지에 대한 규칙도 정해야 합니다. 여기서 디자인 패턴등을 활용합니다. 싱글턴, 상태 패턴, 전략 패턴등은 코드 구조에 대한 내용입니다. 어떻게 구조를 구성하고 관계를 설정하는 설계에 대한 얘기입니다.
2. 게임에는 다양한 리소스가 사용 됩니다. 그래픽, 사운드, 기획 테이블 데이터등 말이죠. 작업자 개개인의 관리도 필요하지만 결국 총괄적으로 살펴봐야 하는건 프로그래머의 몫입니다. 사운드는 어떤 포멧을 사용할건지, 기획 데이터는 CSV인지 JSON으로 할지 또는 불필요한 데이터가 있는지등 말이죠. 사실 2번은 포괄적이긴 합니다. 요지는 게임에서 사용되는 데이터들에 대한 이해입니다.
3. 최적화는 크게 리소스 최적화와 코드 레벨에서의 최적화가 있습니다. 리소스 최적화는, 예를 들어 "이미지들은 2^n의 크기를 사용한다." 또는 "단순 이펙트 사운드는 스테레오가 아닌 Mono 포멧을 사용한다" 라는식으로 말이죠. 코드 레벨은 간단합니다. 연산을 최소화 하는 겁니다. 100번 루핑할거를 10번으로 줄였으면 최적화를 한겁니다. 적절한 자료구조와 알고리즘을 사용하면 이것도 당연히 최적화 입니다.
4. 회사에서는 협업을 하게 됩니다. 예를들어 기획자가 어떤 게임 데이터 테이블을 만들었다고 합시다. 대략 5천개의 행(=Row)을 가지고 있습니다. 그런데 이런 테이블이 10개가 있다고 합니다. 기획자가 데이터를 검수한다고 하면 10 x 5000 = 50000개에 해당하는 행을 일일이 살펴 봐야합니다. 이때 프로그래머는 테이블 데이터가 유효한지를 확인해주는 검증 도구를 만들어 주는 거죠. 이처럼 게임 개발을 진행함에 있어 다양한 편의성을 타부서(기획, 그래픽등)에게 제공하는 도구를 만드는것도 프로그래머의 몫입니다.
5. 4번에서 이어지는 내용입니다만, 협업하는 프로그래머들간의 약속입니다. 예를들어 클래스 멤버 변수는 언더바 + 이름으로 짓는다던가, 인자를 넘기는 방법을 몇가지로 정하다던가 입니다. 혼자 만드는 포트폴리오라고 하더라도 습관적으로 생각하면서 작업하는게 좋습니다.
6. 탄막슈팅이라면 당연히 수많은 탄(bullet)들이 생성됩니다. 이거를 런타임에 계속 무한하게 만드는것보다는 일정 수량을 정해놓고 풀링을 하면 좋겠죠. 이처럼 장르에 대한 기법들이 있습니다. 이런것들을 찾아서 적용하는것이죠.
7. 코드 레벨에서의 유지보수만 얘기하면, 좋은 코드 설계에 따른 가독성입니다. 이 부분은 경험적인 영역이 매우 크다고 생각합니다만, 기본적인 원칙들이 있습니다. 간단하게 "중복 되는 코드를 제거한다.", "분기문 중첩을 되도록 줄이자", "수퍼클래스를 피하자" , "변수와 함수명을 잘 짓자" 입니다. 그리고 주석(=Comment)은 논의의 여지가 있습니다만, 개인적으로 주석이 많다는건 코드 흐름이 좋지 않다는 것 같습니다. 코드 흐름이 분명하면 주석이 줄어들게 되거든요.
마지막으로 버전관리 시스템인데.. 사실 이부분은 선택이긴 합니다. 어차피 회사가면 자연스레 체득하게 되니까요. 개인적으로는, 포트폴리오 프로젝트를 깃허브에 올려놓고 해보는걸 추천드립니다.
위에서 언급한 내용대로, 프로젝트를 하나 설정하고 진행하다보면 공부할 목록들이 정말 산처럼 쌓여갑니다. 예를 들어 적군의 행동을 FSM으로 할지 Behavior Tree를 사용할지 선택하는것도 있습니다. 충돌 처리에 대한 최적화도 있겠죠. 탄과 플레이어간의 충돌이라면 원과 원사이의 거리 비교를 이용해 매우 저렴한 코스트로 처리할 수 있습니다. 언어 레벨에서 보면 C++에서의 코드 최적화를 위해 Effective C++ 같은 서적을 사볼 수 도 있겠죠. 결국 필요한 내용은 구글링과 관련 서적들을 하나씩 사면서 step by step 으로 밟아 가는 수밖에 없습니다.
여기까지가 포트폴리오 프로젝트 및 학습 병행에 대한 이야기 였습니다. (많이 추리고 잘라냈는데도 글이 길어졌습니다.) 그리고 요새는 프로그래밍 서류전형 뒤에 알고리즘 테스트(=프로그래밍 테스트)를 진행하니 이에 대한 공부도 필수겠군요.
p.s. 게임 수학은 https://digital.kyobobook.co.kr/digital/ebook/ebookDetail.ink?selectedLargeCategory=001&barcode=480D200833070&orderClick=LEH&Kc= 추천드립니다.
p.s.2 게임 프로그래머 소양관련으로 괜찮은 링크입니다. https://www.slideshare.net/eiaserinnys/ss-4359340