몇 달쯤 전부터 게임 엔진을 만들어야겠다는 생각을 하게 되었습니다.
말은 게임 엔진이지만, 사실 그리 거창한 건 아니라서 물음표를 붙였어요.
* 2022-02-13 수정 : 그리고 프레임워크라고 보는 게 맞겠다는 생각에 제목을 다 수정했지. 글은 귀찮으니 수정 안함
으레 게임 엔진이라고 하면 Unity나 Unreal Engine을 떠올리기 마련인데,
지금 구상 중인 게임 기획은 상용 엔진에서 구현하기엔 무리가 있더군요.
Unreal Engine은 사실 3D 게임을 위한 엔진입니다.
아직 우리 팀은 제작 팀이라기보다 생초짜 두 명이 재밌는 거 해보겠다고 뭉친 게 전부인지라,
3D를 할 깜냥도 안 되고, Unreal을 써야겠다고 느낄만한 기획도 해 본적이 없습니다.
Unity Engine은 기본은 3D이지만, 2D 게임 제작도 가능합니다.
사실 z축만 안 쓰고 평면만 가져다 쓰면 그게 2D라서 가능한 일이죠.
그래서 원하면 언제든지 3D 효과를 쉽게 줄 수 있다는 게 장점인 것 같습니다.
그럼에도 저 밑바닥부터 새로 쌓아올리려는 이유는,
제가 Unity가 손에 워낙 안 익는다는 이유도 있겠지만 (아니 근데 난 코드를 짜고 싶은데 자꾸 코드 없이도 게임 만들 수 있다고 영상을 들이미는 걸 어째)
시스템을 건드려야 할 일이 너무 많을 것 같은 까닭입니다.
이걸 게임 엔진의 제작 목표라고 보면 되겠네요.
게임 외부로 확장하기 쉬운 게임 엔진을 만들고자 합니다.
언젠가 모드도 지원할 수 있으면 참 좋겠네요.
- 사용 환경과 도구
플래시 이후로 사용한 언어가 C++이란 이유만으로 C++에 목메게 되었습니다.
이제 난 여기서 벗어날 수 없어
아무튼 C++을 사용할 것이고, C++하면 당연히 Visual Studio 아니겠습니까.
라이브러리는 SFML과 EnTT를 사용할 계획입니다.
엔진'?' 제작기인 이유입니다.
그래픽 렌더링도 SFML이 다 해주고, 게임 시스템인 ECS도 EnTT가 다 해줄 겁니다.
그래도 어느 정도의 시스템은 제가 만들어야겠지만요.
- 로드맵
구축하고자 하는 시스템입니다.
- ECS의 Base Class
일단 기본 틀을 만들고, 사용자가 뭘 만들든 이 클래스를 상속하면 돌아가게끔 설계하는 걸 목표로 하고 있습니다.
근데 이게 C++에 적합한 디자인인가? 하면... 모르겠네요. 아무튼 만들고 볼 겁니다.
서론에서도 이야기했듯이, 시스템 (엄밀히 말하면 윈도우)도 엔진에서 다룰 수 있어야 하기 때문에,
ECS와 상호작용할 수 있도록 연결해주는 작업도 필요합니다.
- Event System
EnTT에서 이미 이벤트 시스템을 제공하고 있습니다만, 너무 어려웠습니다. documentation도 없다시피 하고...
이벤트 시스템 또한 사용자가 원하는 대로 호출할 수 있도록 정의해야겠습니다.
람다식도 있고, std::any도 있으니 뭐 어지간한 건 문제 없을 것으로 보입니다.
- Animation
SFML이 멀티미디어, 그 중에서도 게임 제작에 특화된 라이브러리이긴 하지만, 기능을 모두 제공하는 건 아닙니다.
개발자 재량에 따라서 이것저것 만들어야 되는 것 같네요. 찾아보니 SpriteSheet 같은 건 아예 튜토리얼로 제공할
정도로 널리 알려져 있긴 하지만, 직접 만들 겁니다. 안 그러면 ECS랑 따로 놀게 될 겁니다. 애니메이션 표현식은
어떤 포맷을 사용해야 될 지도 고민해야 되겠네요. 지인분도 엔진을 만들고 계신데 나중에 찬스를 써야겠습니다.
- 기타 시스템
사운드나 리소스 관리도 따로 만들어야 됩니다. 사운드는 사실 재생이랑 간단한 페이드 효과만 있어도 작동하겠지만,
좀 자세히 공부해봐야 될 것 같습니다. SFML이 아직도 2.6.0 릴리즈를 하지 않아서, MP3 reader가 없습니다.
디코더만 따로 긁어오거나 ogg 같은 포맷을 사용해도 되겠지만, 나만 쓸 것이 아니라고 상정하고 (나만 쓰겠지만서도
말입니다) 개발하는 입장이 되니 이것도 신경이 쓰이네요. 그리고 예전부터 frequency filter를 만들어보고 싶었습니 다. openAL이 너무 어려워서 때려쳤는데, 다시 한 번 해봐야겠네요.
리소스 시스템의 경우엔, 글쎄요 메모리 관리는 스마트 포인터를 활용하는 정도일 것 같은데 파일 보호를 어떻게 할 지 고민 중입니다. 구글 가로되 어차피 뚫을 사람은 어떻게든 다 뚫기 때문에 암호화 같은 건 부질없다고 하더라고요.
그래서 난독화에만 끝내면 좋을지, 뭔가 더 필요할지... 이쪽으로 지식이 없어서 아리송하네요. 나중에 생각해야겠습 니다.
+ Moddable?
소망이자 난관입니다. Lua같은 걸 사용해서 모드를 만들 수 있게 해주면 참 좋겠다고 생각은 하는데, 그럴 수 있는
시스템을 만들어주는 작업은 또 다르니까요.
+ Mobile?
모바일로의 포팅은 어떻게 하는 걸까요. SFML이 안드로이드나 iOS 빌드가 된다는 이야기는 읽긴 했습니다만,
정말 작동할 지는 또 미지수더군요. 제가 모바일에도 돌아갈 수 있게끔 프로그래밍을 할 수 있을 지도 모르겠고.
이 일은 정말 여를이 되면 시도해보겠습니다. 당장 이 엔진을 만드는 이유부터가 데스크탑에 의존적인 이유기도
하고, 저는 모바일 게임은 정말로 모바일이라는 환경에 맞는 게임이어야 한다고 생각하는 까닭도 있습니다.
키보드를 많이 쓰는 게임을 모바일로 한다면 불편한 게 많을테니까요.
지금 글을 쓰는 시점에서는, 한 10% 정도를 만든 느낌입니다. 생각보다 막히는 구간이 많아요.
그래서 글로 정리하려고 하는 것도 있습니다. 내가 어떤 생각을 했는지 어느 한 켠에는 정리해둬야 좀 덜 헤맬 것 같아요. 아무튼, 주기적으로 글을 써보겠습니다.
'C++ > Game' 카테고리의 다른 글
[Physics] 2D 충돌 감지 구현하기 (2D Collision Detection) - Part 1 (1) | 2022.04.09 |
---|---|
[게임 프레임워크 개발 일지] #5 Multi Style이 적용된 Text (0) | 2022.02.18 |
[게임 프레임워크 개발 일지] #4 Entity와 Component (0) | 2022.02.06 |
[게임 프레임워크 개발 일지] #3 EventManager 설계 (0) | 2021.12.31 |
[게임 프레임워크 개발 일지] #2 SFML의 렌더링 정체와 Multi Thread (0) | 2021.12.17 |