2차 프로젝트 리뷰

March 17, 2026 (5d ago)

0 views

부트캠프 두번째 프로젝트: 크레이지아케이드2

서론

마음가짐

지난 2월, 나는 부트캠프 첫번째 게임 프로젝트로 [크레이지아케이드]를 모작했다.

1차 프로젝트가 끝난 뒤 자료구조와 알고리듬 수업을 들었고 곧바로 이를 응용하는 주제로 2차 프로젝트 기간이 시작됐다. 두번째부터는 그래도 한 번 해봤다고 첫번째보단 고개를 들 수 있게 됐다. 그래서 가장 먼저 생각한 것은 '이제부터 게임을 만들 때 무엇을 취할 것인지', 방향성을 확실히 정한 뒤 움직여야겠다는 마음가짐이었다.

게임에서의 몰입

최근에 부트캠프 출퇴근 시간에 이야기 생성기 《림월드》의 개발자 타이난 실베스터의 「게임 기획의 정석」을 읽고 있다. 이 책은 미국인 심리학자 '미하이 칙센트미하이'의 '몰입이론'를 바탕으로 플레이어는 게임을 진행하면서 '플로우Flow' 상태에 놓인다고 설명한다. 이 상태는 단시간 몰입하는 집중 상태를 의미하며, 실제 자아와 게임 내 아바타 사이의 정신적 구분이 약해지고 경험이 일체화되는 짧은 순간을 뜻한다(출처: [Ludogogy] 게임과 학습에서의 몰입이론(Flow Theory)).

그렇다면 이 플로우는 어떻게 만들어질까? 칙센트미하이는 다음 세 조건을 얘기했다.

  1. 과업 도전에 대한 인식과 그것을 수행할 수 있는 사람의 능력에 대한 인식 사이의 균형. 다시 말해, 과업은 너무 쉽지도 않고(지루해서 몰두하지 못함) 또는 너무 어렵지도 않은(실패의 좌절을 가져옴) 인식된 '골디락스 존'에 있어야 한다.
  2. 행동의 구조를 확립하고 과정을 나타내는 데 도움을 주는 명확한 목표
  3. 목표를 향한 진행 과정을 측정하고 성과에 대한 신속한 조정을 허용하여, 몰입을 유지하는 데 도움을 주는 명확하고 즉각적인 피드백 위 조건에 의거해 내 첫번째 결과물을 재평가했을 때 1, 2번이 결여돼있었다. 도전의식을 불러일으킬 요소가 없어 게임을 지속해야할 이유를 플레이어가 찾지 못했다.

적 인공지능 강화

따라서 플레이어가 재미를 느끼도록, 몇 번이고 반복해서 플레이할 수 있도록 적의 인공지능을 적정 수준으로 강화시키는 것을 이번 프로젝트의 목표로 설정했다.

본론 1: 게임 플레이의 긴장감

내가 만든 크아는 플레이어의 조작감은 나쁘지 않았지만 그뿐이었다. 적이 움직이기만 할 뿐 플레이어처럼 물풍선을 설치하지 못해 그 다음 단계로 플레이어를 이끌지 못했다.

그래서 난 생각했다. 어떤 AI를 만들어야 플레이어가 불합리함을 느끼지 않으면서 재밌게 여러번 반복해서 플레이할 수 있을까? 인공지능을 만들기 전에 몇가지 마일스톤을 설정해봤다.

  • 플레이어처럼 막힌 길을 뚫거나 상대방을 공격하기 위해 물풍선을 설치한다.
  • 목적성 없이 무작위로 움직이는 것이 아닌 플레이어를 죽이러 가도록 만든다.
  • 바보같이 혼자 죽거나 너무 뛰어나서 모든 공격을 회피해서도 안되고 플레이어와 비슷한 수준이어야 한다.
  • 아이템 획득으로 강화되고 물풍선을 밀어 플레이어처럼 변수를 만들어낼 수 있어야한다. 위 목표를 한마디로 요약하면 '공정성'이다. 상대도 최소한 나보다 동등하거나 뛰어나며, 게임의 규칙이 서로에게 공평하게 적용될 때 플레이어는 몰입하게 되며 게임 개발자가 아니라 스스로에게서 잘못을 찾고 클리어하기 위해 계속해서 도전한다.

물풍선 설치 AI

가장 핵심적인 AI 구현엔 행동트리BehaviorTree 구조를 택했다(2차 프로젝트 일지 - 4일차). 발표 후 피드백으로 상태 머신Finite State Machine이란 선택지도 있다는 사실을 뒤늦게 알게 됐다. 그러나 역시 상태 머신보단 행동트리가 더 적합했다.

RPG 필드의 일반 몬스터를 만들어야했다면 상태 머신을 사용했겠지만(정찰, 추격, 공격 순회), 크아는 소수의 적이 인간과 비슷한 고차원적인 동작을 반복해야했기 때문에 행동트리를 자연스럽게 선택하게 됐다.

이번 프로젝트의 적 인공지능 구현도이다. 화면에서 움직이는 Enemy 객체를 움직이는 주체 Enemy Controller는 이동트리와 액션트리를 각각 수행한다.

BFS & AStar Algorithm

주요 노드인 위험지역 평가, 이동 관련 코드BFS와 AStar 알고리듬으로 구성됐다. 아래는 행동트리를 더 요약한 과정이다.

  • 항상 플레이어의 위치로 갈 수 있는 벽 제외 이상경로를 계산(박스 무시)
  • 현실은 박스도 벽과 같이 일반 이동으로는 지나갈 수 없기 때문에 일반 이동으로만 이동할 수 있는 최대경로 계산
  • 최대경로 중에서 물풍선 설치로 박스를 부술 수 있는 지역 검색
  • 해당 지역에 물풍선 설치했을 때 퇴로 확보할 수 있는지 평가
  • 물풍선 설치 후 즉시 설치지역 벗어나기
  • 물풍선 예상 폭발 범위(=위험지역) 내에서 이득을 취할 수 있는지 평가
    • 각 타일별 폭발 시간 전에 지나갈 수 있는지 평가
    • 위험지역이더라도 물풍선을 설치해 박스를 부술 수 있는지 평가
  • 위 조건을 만족한다면 위험지역이더라도 이동해 설치하고 탈출함(주로 빠져나오고 다시 진입하기보단 안전지역으로 도망치면서 이어 설치함)

개선점

[적 인공지능 움직이는 짤] 위 설계대로 인공지능을 구현하고 시연한 캡처. 몇가지 문제점이 남았다.

  1. 안전지역과 위험지역 사이에서 진동한다
  2. 설치 후 바로 탈출하지 않고 아슬아슬하게 맞춰 탈출한다.

핵심적인 게임 플로우에 영향을 주는 요소는 아니지만 처음 플레이어가 목격했을 때 당황스럽게 할 요소였다. 이렇게 동작하는 원인으로는 아래와 같이 추정했다.

  1. 위험지역 진입과 안전지역 탈출 로직이 충돌하고 있고,
  2. 설치 후 위험지역 폭발시간 계산 단계에서 한계점threshold을 잘못 세팅해놓음 고치고 싶었지만 후반부 시간이 촉박해 우선순위에 밀려 수정되지 못했다.

기타

이 인공지능 설계를 도입하기 위해 프로젝트 전반 설계를 뜯어고쳤다. 이것도 이틀을 소모할만큼 대공사였지만 이 글의 목적과는 맞지 않아 간단히 언급만 하고 넘어간다. 이틀간 수정했던 설계는 모두 다음 챕터인 언리얼 엔진의 설계를 본따왔으며 다음과 같다.

  1. Player, Enemy 갓 오브젝트God Object → Character 공통 클래스로 분리 후 컴포넌트로 쪼개기
  2. Player와 Enemy의 조작은 각각의 Controller로 분리해 복잡도 낮추기
  3. Delegate와 WorldQueryService 모델을 도입해 Character와 World 사이의 결합도 분리하기

본론 2: 게임 비주얼

문자열 기반 게임플레이 움짤 기존 게임은 문자열로만 그려졌다. 당시 상황으로 한정한다면 넘어가줄만한 지점이지만 새 프로젝트의 목표 아래에선 개선이 필요한 부분이었다. 그 이유는 다음과 같다.

  • 사람들은 뚝뚝 끊기는 디지털식보다 부드러운 아날로그식 움직임을 자연스럽게 느낀다.
  • 사람들의 '게임을 완벽히 소유하고 있다는' 느낌은 내가 상상한 컨트롤과 게임의 실제 이동이 일치했을 때다.
  • 문자열 기법은 표현의 자유도가 극도로 작은 방식이다(문자열을 매우 작게해서 그리지 않는 이상) 따라서 방법을 찾아보다 아래 방식을 택하기로 결정했다.

Half-block Unicode

There are two block elements, the half block characters ("▀" and "▄"), that allow us to use the terminal as an actual canvas, with pixels that can be set individually. ... Those characters allow us to divide a cell into two vertically, by making smart use of foreground and background colors.(2차 프로젝트 일지 - 3일차)

하프블록 유니코드를 사용하면 놀랍게도 위 사진(포켓몬과 같은 표현을 할 수 있다. 그 원리는 아래와 같다.

[과거]게임 좌표 ──────────────────────→ 화면 픽셀         tileSize가   결정[현재]게임 좌표 ──→ 가상 픽셀 버퍼 ──→ 화면 픽셀         tileSize가 결정    축소(downscale)해서         (내부 정밀도)       콘솔에 맞춤가상 버퍼 (고해상도)              화면 버퍼 (콘솔 크기)┌─────────────────┐              ┌─────────┐  272 × 224 px     ──축소──→    51 × 42   ──half-block──→ 콘솔  (17타일 × 16)                  픽셀   └─────────────────┘              └─────────┘

문자열 1개 = 타일 1개 개념에서 '설정파일'에 설정된 타일 사이즈만큼의 유니코드 문자열이 타일 1개로 압축되도록 변경했다. 이 설정(down-scale)을 하지 않으면 아래와 같이 기존 문자열 사이즈만큼 하프블록 유니코드가 한 칸을 차지하게 돼 필요 이상으로 리소스가 확대된다.

아래는 다운스케일링한 화면.

이 변경점을 통해 고해상도 표현이 가능해졌다. 1차 프로젝트 때 적용됐으나 보이지 않던 캐릭터 이동 선형 보간 처리도 드러났고 좀 더 정돈된 톤을 만들 수 있었다.

개선점

역시 이부분도 시간이 부족해 해상도만 높이고 오브젝트의 표현에는 신경쓰지 못했다. 스프라이트 시스템까지 구축해놨으나 유니코드로 캐릭터와 벽, 박스, 물풍선, 효과들을 찍을 시간이 없어 활용하지 못했다. 또한 색상 코드도 윈도우 콘솔 16비트 색상을 그대로 맵핑해 사용했기 때문에 명암 구분이 안되는 문제도 있었다. 다른 수강생 중에 엄청난 퀄리티의 웜즈 모작 프로젝트가 있었는데, 그 분은 '복셀(Voxel)' 시스템을 채택해 가볍게 소개를 하고 넘어가려 한다.

복셀Voxel

Volumne + Pixel의 합성어로, 2D의 픽셀로 3D를 표현하는 방식을 뜻한다. 우측이 흔한 3D 엔진의 폴리곤Polygon 활용 모델링이라면 좌측이 복셀을 활용한 모델링이다. 위 사진으로만 보면 쓸모없어보이지만 가장 유명한 응용작으로 《마인크래프트》가 있다는 사실을 알면 어느 하나가 월등하다고 단정지을 수 없다.

결론

이렇게 해서 2차 프로젝트를 마무리지었다. 시각적으로 큰 변화는 없었으나 발표 후 미니게임잼 시간에 내 크아를 즐겨주시는 수강생들을 보고 목표에 근접했다고 느껴 뿌듯했다.

완성하지 못한 부분들이 많으나 크아 모작은 여기서 멈추기로 했다. 곧바로 이 부트캠프의 본론인 언리얼 엔진 수업이 시작돼 프로젝트 회고를 쓰는 지금 벌써 2주가 지났고 지난 두 달보다 훨씬 밀도있는 나날을 보내고 있기 때문이다.

3차원 환경의 렌더링을 해내야하기 때문에 3차원 환경에서 필요한 기반지식들을 공부하고 있다. 부트캠프 교재인 「이득우의 게임수학」으로 난생 처음 삼각함수의 그래프를 인지했고, 행렬이라는 무시무시한 개념이 도사리고 있다. 수업시간은 블루프린트로 먼저 기능을 만들어보고 있는데 진도를 나가는 속도가 장난이 아니다. 그만큼 하루하루 프로젝트 속 게임의 기능도 빠르게 추가되고 있다.

다음 프로젝트 회고는 2주간 진행되는 언리얼 블루프린트 프로젝트로 찾아오겠다. 내 게임개발 목표인 소울라이크 게임을 드디어 만들어볼 수 있다니, 벌써부터 설렌다.


부록: AI 사용에 관해

생각꽂이에서 별도의 글로도 정리한 바 있지만(생각꽂이/AI 쓰는거 부끄러워하지 마십쇼), 난 이번 프로젝트엔 특히나 AI를 100% 이상 활용했다. 대부분의 코드는 내가 작성하지 않았다. 내가 코드에 직접적으로 수정을 가한 부분은 영어로 주석달기, 파일 정리 뿐이었다. 나머진 모두 AI가 생성한 코드였다.

혹자는 이 모습을 보고 AI에게 사고능력을 의탁한 빈껍데기라고 비난할지도 모른다. 하지만 그렇지 않다. 이미 위에서 설명한 것처럼 나는 AI가 생성해준 코드를 모두 체화했다. AI가 생성하면 곧바로 공부한 뒤 그 결과물 위에 추가해야할 기능, 잘못 작성돼있는 부분에 대한 수정을 요청했다. 이 작은 사이클을 반복하면서 코드는 내 손을 거치지 않았지만 이 프로젝트의 통제권은 온전히 내가 소유할 수 있게 되었다.

이것을 나는 위임할 줄 아는 능력이라 일컫고 싶다. 내 신체/정신적 자원은 유한하다. 혼자서 이 프로젝트를 내가 원하는 모습으로 만들기 위해선 한정적인 내 자원을 효율적으로 분배해서 최대한 이끌어낼 스스로에 대한 의무가 있다. 코드를 치다 소중한 집중력을 다 소진해버리고 개발 속도가 느려지는 경험을 이미 웹개발자 시절에 선명하게 경험했기 때문에, 이제 그 우를 반복하지 않으려 하고 있다.

앞으로도 나는 AI를 적극적으로 활용할 계획이다. 이번 프로젝트에선 Visual Studio의 Github Copilot Chat을 Pro 플랜으로 사용했는데, 다음 프로젝트부턴 최근 카카오 대란으로 구매해놨던 ChatGPT Pro 플랜 5개월짜리를 본격적으로 활용해보고, 그 이후부턴 Claude Code를 사용해볼까 한다.

웹개발 필드에선 이미 멀티 에이전트와 스킬 방식이 안정적으로 자리잡아 AI 사용의 첨단을 달리고 있다. 게임 개발 쪽은 아직 엔진 GUI에 크게 의존하고 있기 때문에, 출시 예정인 빌트인 에이전트가 나오기 전까진 사실상 AI 워크플로우가 이어지고 있지 않아보인다.

1년 전 영상이지만 이제는 1년도 옛날로 치면 3년 전 영상으로 봐야할 것이다. 어쨌든 이 영상에서 AI 활용은 주로 모델링 에셋, 애니메이션 등 프로그래밍 외적 요소에 활용되고 있음을 확인할 수 있다. ComfyUI가 대표적인데, 적당히 혼자서 팀 모집이나 지원사업 제출용 프로토타입을 만드는데 활용할 수준은 돼보인다.

게임 업계 AI도 어서 발전해서 워크플로우가 이어졌음 좋겠다. 게임의 완성도를 높이기 위해선 당연히 사람의 손길이 닿아야한다고 생각하지만, 사람의 포텐셜을 필요한 부분에 더 효율적으로 집중시킬 수 있게 쓰잘데기없는 기초작업들은 AI가 대체해야한다고 생각한다. 그래야 인디게임개발도 더 살아날 것이다.