김준성의 포트폴리오

자기소개

소개글 및 타임라인

김준성 증명사진
김준성 마비노기 캐릭터 사진
김준성 마비노기 영웅전 캐릭터 사진
김준성 마비노기 모바일 캐릭터 사진

게임을 진심으로 사랑하는, 차근차근!   끈기있게! 성장하는 김준성입니다.

성장 과정 및 장점

어릴 적부터 친구들이 ‘메이플’에서 발록을 잡을 때, 저는 홀로 ‘마비노기’ 켈라 해변에서 제련 1랭크를 위해 야금술을 연마했습니다. 대중적인 게임도 당연히 즐겼지만, 콘셉트가 뚜렷한 게임에 더 깊이 빠져들었습니다. 단순히 ‘재미있다’는 이유 하나로 게임에 푹 빠졌으며, 그 당시 땅에서만 걸어다니던 게임과 달리, 게임 프리프와 마비노기 이리아 대륙에서 겪은 비행 시스템은 어린 시절 저에게 큰 충격과 해방감을 주었으며, ‘이런 게임을 직접 만들 수 있다면 얼마나 재미있을까’라는 생각은 자연스럽게 저를 컴퓨터공학과로 이끌었습니다.

하지만 현실은 이상과 달랐습니다. 수학과 공학 중심의 ‘학문’은 물론 성장을 위해 필수적이었으나 겉보기에 화려한 ‘게임’에 비해 낯설었고 실력에 비해 규모가 컸던 인디게임 프로젝트는 수년의 휴학에도 끝내 완성하지 못한 채 결국 더이상 미루지 못한 군 복무로 멈춰야 했습니다.

돌이켜보면, 이 프로젝트가 실패로 끝난 데에는 몇가지 명확한 이유가 있었습니다. 첫째, 당시의 역량에 비해 지나치게 거대한 PC 게임을 기획했다는 점입니다. 기획이란 것을 제대로 경험해본 적도 없었는데 대화, 퀘스트, 감정 조합, 도감, 호감도 시스템 등 다양한 요소를 포함한 방대한 게임을 처음부터 기획하려 했던 것은 무모했습니다. 코딩 실력이나 객체지향 개념조차 제대로 잡히지 않은 상태에서 규모만 키운 셈이었습니다. 둘째, 팀원 모두 또래 친구들로 구성되어 있었기에 확고한 리더십이 부족했습니다. 중요한 결정을 빠르게 내리기보다는 서로를 배려하다 보니 우유부단한 상황이 반복되었고, 공과 사가 흐려져서 공적인 작업도 애매해지고 사적인 감정도 상하는 경우가 더러 있었습니다. 명확한 방향성과 책임자가 있었다면 더 빠르고 효율적인 진행이 가능했을 것이라는 아쉬움이 남습니다.

그 시기, 개발자로서 부족함을 크게 느꼈지만 동시에 UI와 사용자 경험에 대한 관심은 더욱 커졌습니다. 실제로 인디게임 프로젝트에서도 UI 시스템을 주로 구현하며 유저와 가장 가까운 영역에서 상호작용하는 이 작업이 제게 큰 매력으로 다가왔습니다. 전산병으로 입대한 군 복무 중에는 HTML 유지보수 업무를 맡게 되었고 그 경험을 통해 게임 UI와 웹 UI가 본질적으로 닮아 있다는 것을 느꼈으며 UI에 대한 흥미와 애정을 더욱 확신하게 되었습니다.

전역 이후, 게임에 대한 관심은 식지 않아 졸업 프로젝트로도 Unity 기반의 자연어 처리 게임을 개발하였습니다. 이때도 UI 설계 및 구현을 직접 담당하게 되었고 이 과정에서 제가 가장 즐겁고 몰입할 수 있는 분야가 게임임을 확신했습니다. 이후 UI/UX에 대한 이해를 더 깊이 확장하고 범용적인 기술적 기반을 넓히기 위해 프론트엔드 개발을 본격적으로 공부하게 되었고, 현재는 부트캠프를 통해 HTML, CSS, JavaScript, TypeScript, React 등 다양한 기술을 학습하고 있습니다.

많이 돌아왔지만, 그만큼 더 단단하고 넓은 시야와 태도로 준비하고 있습니다.
새로운 마음으로, 이전의 경험과 실패를 발판 삼아 누구보다 진심으로 게임 개발자의 길을 걷고자 합니다.

  • 원활한 의사소통 및 중재 능력
    - 팀 프로젝트 과정에서 다양한 갈등과 상황을 겪으며, 상황을 객관적으로 파악, 중재 및 조율하는 법을 체득했습니다.
  • 끈기와 책임감
    - 나이로 인한 강제 징집소지를 연기하고 4~5년의 휴학을 감내하며 프로젝트 완성을 위해 달려온 경험이 있습니다.
  • 근면
    - 초·중·고 12년 개근상 수상 경력이 있습니다. 그만큼 기본에 충실하고 꾸준한 성격입니다.
  • 자기성찰
    - 실패에 머무르지 않고 그 안에서 의미와 뜻을 찾아내 성장하고자하는 태도를 갖고 있습니다.
  • 2012-2015
    - 경기도 성남시 소재 한솔고등학교 졸업
  • 2015-2016
    - 건국대학교 컴퓨터공학부 재학
  • 2017-2022
    - 휴학 및 Unity 프로젝트 <아이스크림 트럭> 개발
  • 2022-2024
    - 공군 제10전투비행단 복무 및 전역
  • 2024-현재
    - 학부 수료 후 멋쟁이사자처럼 프론트엔드 부트캠프 수강중

프로젝트

  • 아이스크림 트럭

    Unity 2017 - 2022 수상
    프로젝트 아이스크림 트럭 썸네일
    프로젝트 아이스크림 트럭 썸네일
    프로젝트 아이스크림 트럭 썸네일
    • 장르 : 어드벤처 시뮬레이션
    • 참여 인원 : 4인
    • 개발 환경 : Unity
    • 개발 기간 : 2017 - 2022

    《아이스크림 트럭》은 아이스크림 트럭 판매원 ‘맥스’가 토끼 소녀 ‘미아’의 잃어버린 풍선을 따라 환상적인 마을들을 여행하는 어드벤처 시뮬레이션 게임입니다. 각 마을은 고유한 테마와 에피소드를 지닌 옴니버스 구성으로 진행되며, 감정을 주제로 한 아이스크림 조합으로 손님들의 문제를 해결합니다. 타이쿤 요소, 다양한 감정과 토핑, 매력적인 배경과 코스튬을 통해 유쾌하고 감성적인 플레이가 특징입니다. 학부 휴학 중 진행했던 인디게임 프로젝트이며 2020 부산 인디 커넥트 페스티벌(BIC Festival) 루키 부문 ‘Excellence In Casual’을 수상하였습니다.

    구현 담당 파트

    • 데이터 및 DB

      기능 설명
      게임 내에는 아이템, 음식, 조합법, NPC, 도감, 퀘스트 등 다양한 종류의 데이터가 존재하며, 각 요소는 고유의 속성과 일관된 계층 구조를 가집니다. 이들을 규칙성있게 게임 시스템 전반에서 참조할 수 있도록 데이터 클래스를 설계하였습니다.
      문제 상황
      단순한 아이템만 해도 음식, 꾸미기, 퀘스트 등으로 나뉘며, 음식 내부에는 콘, 토핑, 아이스크림 등 추가적인 세부 분류가 존재합니다.이처럼 계층적이고 복잡한 구조를 어떻게 유지보수하기 쉽게 설계할지 고민하였습니다 또한 이런 데이터를 저장할 적합한 Unity 친화적인 데이터베이스가 필요했습니다.
      해결 방안
      ItemInfo_Entity를 루트 클래스로 하여, 대분류→소분류로 이어지는 다양한 상속 계층 구조를 설계했습니다. 이를 통해 공통 속성은 상속으로 묶고, 각 유형의 특성은 개별 클래스로 정의해 확장성과 가독성을 높였습니다. 데이터베이스는 Unity의 ScriptableObject로 구현하여 .asset 형태로 관리되며, 런타임 시 자동 로드되어 사용하였습니다. 각 DB는 이름과 타입 기반으로 데이터를 빠르게 검색할 수 있는 메서드를 제공하며, 싱글톤 패턴으로 전체 시스템에서 일관되게 접근 가능합니다. 엔진에서 제공하는 네이티브 데이터 컨테이너이기 때문에 에디터에서 쉽게 수정이 가능하고 Sprite, 사운드 등 유니티에서 다루는 데이터 타입을 조작하기에도 편리했습니다.
    • 인벤토리

      기능 설명
      다양한 유형의 아이템(음식, 퀘스트, 꾸미기 등)을 효과적으로 분류·관리하기 위해, 중앙 매니저와 하위 매니저로 구성된 위임 기반 인벤토리 시스템을 설계하였습니다.
      문제 상황
      게임에는 크게 음식 아이템, 퀘스트 아이템, 꾸미기 아이템 등 여러 종류가 있었고, 그 안에서도 토핑, 베이스, 과일 등 세부 분류가 매우 다양했습니다. 각 아이템마다 UI 구조나 처리 방식이 달랐고, 하나의 인벤토리 시스템으로 모든 아이템을 관리하면 당연히 코드가 복잡하게 얽히고 유지보수가 어려운 구조가 되지 않을까 고민하였습니다.
      해결 방안
      이에 따라 모든 아이템 관련 요청을 수신하는 중앙 매니저(InventoryManager)를 두고 실제 처리는 아이템 종류에 따라 분리된 하위 매니저(예: 음식용 RefrigeratorManager, 캐릭터 꾸미기용 ClosetManager 등)에 위임하는 구조로 설계하였습니다. 이 방식은 아이템 타입에 따라 책임이 나뉘고 새로운 아이템 종류가 생겨도 필요한 부분만 추가 구현하면 되는 구조가 되었습니다. 당시에는 빠르게 구현하는 데 집중했지만 지금 생각해보면 각 아이템 처리 전략을 인터페이스 기반으로 추상화하는 Strategy 패턴을 적용했다면 더욱 명확하고 유연한 구조로 설계할 수 있었겠다는 아쉬움이 있습니다.
    • 대화

      기능 설명
      플레이어 및 NPC의 대화 시스템을 구현하였습니다. 일반적인 기본 대화부터 선택지가 있는 대화, 간소한 말풍선 형식의 대화 등 다양한 형식의 대화를 지원하며 Typewritter 효과, NPC의 입이 함께 움직이거나 한 글자 출력될 때마다 소리가 같이 출력돼 NPC가 말하는 것 같은 효과를 추가해 몰입감을 높였습니다.
      문제 상황
      초기 구현에서는 간단한 DialogManager 클래스로 구현하였으나, 기획을 거듭하며 대사 출력, 타이핑 효과, 음성 효과, 말풍선 위치 등의 새로운 기능이 요구되었습니다. 유지 보수 측면을 간과하고 Manager가 거의 모든 기능을 다룰 정도로 코드가 비대해졌습니다. 몇년이 지난 지금 다시 코드를 보았더니 각 기능의 흐름을 파악하기조차 어려운 상태였습니다.
      해결 방안
      SRP에 맞게 대화 데이터 → 표현(타이핑, 음성) → UI 단계로 책임을 계층화 할 것을 생각해보았습니다. 또, 상점 시스템에서 해결방안을 모색했던 것처럼 대사를 출력할 시에는 이 행위를 인터페이스로 추상화하고 이를 구현한 전략 클래스를 사용하는 Strategy 패턴의 도입을 생각해보았습니다. 이를 통해 가독성, 확장성, 유지보수 측면에서도 지금보다 더 비용 절감에 도움이 될거라 생각합니다.
    • 상점

      기능 설명
      플레이어가 상점에 입장해 상품을 선택하고, 장바구니에 담고, 결제까지 진행하는 일련의 쇼핑 흐름을 구현했습니다.
      문제 상황
      기존의 게임 상점 시스템은 보편적으로 정적인 UI와 버튼 중심의 구매 방식으로 구성되는 경우가 많습니다. 그러나 본 프로젝트에서는 아이템 클릭 시 NPC의 대사가 출력되고 사용자가 실제로 서명하는 실감나는 방식의 UI를 구성함으로써 더욱 재미있는 경험을 구현하고자 했습니다. 결과적으로 상점은 다음과 같은 흐름으로 기획되었습니다.
      《상점 입장 → 카탈로그 형식의 구매 UI에서 아이템 클릭 -> 아이템 선택 대사 출력 -> 영수증 형태의 UI에서 수량 조절 -> 서명 인터랙션 -> 결제 여부 판단 및 완료》
      이 모든 흐름이 자연스럽게 이어져야 했기 때문에, 단순한 버튼 클릭 중심의 구매 방식에서 벗어난 구조적 고민과 설계가 필요했습니다.
      해결 방안
      이러한 흐름을 효과적으로 제어하기위해 Unity의 Coroutine을 적극적으로 활용하여 단계별로 UI 애니메이션, 상품 클릭 시 대사 출력, 입력 대기 등을 순차적으로 제어할 수 있도록 구현하였습니다. 또한 RaycastPointerEventData를 통해 사용자의 서명 영역에 대한 마우스 입력을 조절했고 Unity의 LineRenderer 컴포넌트를 활용해 마우스 움직임을 따라 영수증에 사인하는 듯한 경험을 구현하였습니다. 결과적으로 단순한 클릭 이벤트보다 사용자에게 능동적인 상호작용과 몰입감을 제공하는 구매 경험을 완성할 수 있었습니다.
    • 캐릭터 및 트럭 꾸미기

      기능 설명
      게임 내 주인공 캐릭터와 트럭을 꾸밀 수 있는 기능을 구현하였습니다. 각 꾸미기 부위별로 탭 UI를 제작하고, 아이템을 드래그 앤 드롭으로 장착 및 해제할 수 있도록 구성하였습니다.
      문제 상황
      캐릭터와 트럭 모두 탭 UI, 아이템 드래그 앤 드롭을 통한 장착, 유니티 인터페이스 등을 이용한 큰 결을 같이하는 기능들이 많았습니다. 그러나 일정영역 안에 아이템을 놓기만 하면 되는 캐릭터와는 달리, 차체의 원하는 부분에 자유롭게 부착해야하는 스티커 형태의 트럭 꾸미기 아이템의 경우 창문이나, 문틈처럼 현실적으로 부착되면 안되는 부위에 대한 고려 또한 필요했습니다.
      해결 방안
      따라서 트럭의 경우에는 PolygonCollider2DRaycast를 활용해 정확히 부착가능한 영역을 판별하고, 이를 통해 부착 불가능한 영역일 시 아이템을 빨간색으로 보이게 하여 시각적 피드백을 제공하여 사용자 경험을 고려하였습니다.
    • 다국어 지원

      기능 설명
      게임 전반에 사용되는 모든 텍스트(아이템 이름, 퀘스트, NPC 대사 등)를 외부 CSV 파일로 관리하고 이를 파싱하여 게임 내에서 일관되게 사용할 수 있도록 시스템을 구성하였습니다. 이를 통해 다양한 언어 버전의 게임을 효율적으로 제공할 수 있도록 준비하였습니다.
      문제 상황
      게임 내에 사용되는 방대한 텍스트를 어떻게 관리하고 처리할지에 대한 고민이 있었습니다. 특히 본 프로젝트는 한국어뿐 아니라 영어 등 다양한 언어를 지원하고자 했기 때문에 다국어 환경에서도 자연스럽게 언어를 변경할 수 있는 텍스트 시스템이 필요했습니다. 이를 위해 Unity 커뮤니티와 다양한 레퍼런스를 조사한 결과 CSV 파일 형태로 텍스트를 저장하고 파싱하는 방식이 가장 대중적인 방법 중 하나라는 것을 알게 되었습니다. 기존 방식은 단순히 CSV 파일을 파싱하는 기능에 그쳤고, 저희 프로젝트에 맞게 다음과 같은 확장이 필요했습니다. 언어 설정에 따라 자동으로 해당 언어의 텍스트를 로드하고, 각 항목을 DB와 연동해 전반적인 시스템과 통합적으로 작동할 수 있도록 구조화하는 작업을 고민해야 했습니다.
      해결 방안
      각 csv 파일의 텍스트 항목은 고유의 키 값을 가지며 프로젝트에서 가지는 전역 언어 설정값(Kor, Eng, 등)과 결합된 필드명(title_Kor, name_Eng 등)을 기준으로 다국어 데이터를 파싱하도록 구현하였습니다. 파싱된 결과는 구현해놓은 각종 DB(ItemDB, QuestDB, TalkDB 등)에 주입되며, 이를 통해 텍스트 출력이 필요한 위치에서 즉시 ScriptableObject를 참조 가능하도록 하였습니다.
    • 캐릭터 애니메이션

      기능 설명
      내부적인 로직외에도 캐릭터의 애니메이션 클립을 다수 제작하였으며, 특히 동물 캐릭터의 생동감 있는 움직임을 구현하는 데 집중했습니다.
      문제 상황
      기본적인 Unity의 Transform 기반 애니메이션만으로는 다관절 구조의 동물 캐릭터의 움직임을 자연스럽게 표현하는 데 한계가 있었습니다. 특히 꼬리처럼 탄력성과 유기적인 연결성이 중요한 부위에서 부자연스러운 움직임이 도드라졌습니다.
      해결 방안
      이에 따라 본 리깅 및 메쉬 스키닝을 지원하는 Puppet2D 애셋을 도입하였습니다. Puppet2D는 스프라이트를 메쉬 형태로 변환하고, 본(Bone)을 생성하고 이를 메쉬와 Skinning 하여 각 관절을 자연스럽게 연결할 수 있도록 도와줍니다. 이를 통해 결과적으로 캐릭터의 팔다리, 꼬리 등 유연한 움직임이 필요한 부위의 애니메이션을 자연스럽게 구현할 수 있었습니다.
    • 미니게임

      기능 설명
      게임 시나리오에 맞춰 붕어빵 만들기, 리듬게임, 물건 옮기기 등 다양한 미니게임을 구현했습니다. 각각의 미니게임을 이야기 흐름 속에서 자연스럽게 등장시켜 플레이어에게 몰입도 있는 체험을 제공하기 위한 연출과 조작 구조로 구성하였습니다.
      문제 상황
      대표적으로 물건을 정해진 위치로 옮기는 방식의 미니게임에서는 라운드 형식의 전개, 승리 횟수에 따라 다른 결과, 자동으로 꽃을 가져오는 AI 등을 고려해야했습니다. 그 과정에서 꽃 오브젝트의 생성 타이밍과 위치, 플레이어의 입력을 동기화하는 과정에서 타이밍 문제와 오브젝트 충돌 처리 문제가 발생하곤 했습니다. 또한, AI 캐릭터도 함께 작동해야 했기 때문에 흐름 제어에 신경써야했습니다..
      해결 방안
      미니게임 매니저를 중심으로 플레이어, 오브젝트, 타이머 등 핵심 게임 요소들의 주기를 일괄적으로 관리하도록 설계하였습니다. Coroutine을 활용해 게임 흐름을 라운드 단위로 제어하고 꽃 프리팹을 Pooling하여 성능 저하 없이 일정한 간격으로 생성되도록 처리했습니다.
  • RPG 마을 타이쿤

    Godot 2021
    • 장르 : 건설 경영 시뮬레이션
    • 참여 인원 : 3인
    • 개발 환경 : Godot(GDScript, C++)
    • 개발 기간 : 2021.09. - 2021.12.

    RPG 마을 타이쿤은 학부 수업 '게임프로그래밍'의 조별과제로 수행한 프로젝트입니다. 건설 경영 시뮬레이션 장르의 게임이며 '왕도 RPG의 마을을 0에서부터 건설한다'는 취지에서 개발되었습니다.

    구현 담당 파트

    • UI 통합 제어

      기능 설명
      게임 내 다양한 UI 요소를 일관되게 관리하기 위해 UIControl.gd를 중심으로 한 통합 제어 시스템을 구현하였습니다. UIControl.gd는 CanvasLayer 기반의 UI 루트로서, WorldManager, InputManager, CameraManager 등 주요 게임 시스템과 직접 연결되어 있으며 UI 상태 변경, 정보 갱신, 유저 인터랙션 이벤트 등을 일괄적으로 처리할 수 있도록 구성하였습니다..
      문제 상황
      UI 요소가 종류별로 다양하고 동시다발적으로 사용되다 보면, 각 UI가 제각기 초기화되고 동작 흐름이 분산되어 충돌이나 예외가 발생할 위험이 있다고 생각했습니다. 또한, UI 기능이 각 노드 내부에 흩어지면 새로운 UI 추가 시 전체 흐름을 파악하기 어려워진다는 점도 고민이었습니다.
      해결 방안
      UI의 루트를 UIControl.gd로 고정하고, 모든 UI 관련 동작을 이 클래스에서 집중적으로 처리하도록 설계하였습니다. 각 시스템(InputManager, CameraManager 등)의 주요 기능에 접근 가능한 구조로 구성하여 UI에서 발생하는 사용자 입력에 따라 즉시 카메라를 이동시키거나 오브젝트의 정보를 불러오도록 연결하였습니다. 또한 외부 시스템에서 UI에 정보를 전달할 수 있도록 신호(Signal) 기반의 갱신 메커니즘을 마련하였습니다.
    • 이벤트 로그

      기능 설명
      게임 플레이 중 발생하는 다양한 이벤트(주민 입주, 직업 변경, 아이템 획득 등)를 HUD 상단에 한 줄 로그 형태로 출력하고, 동시에 전체 로그 히스토리를 확인할 수 있는 패널을 구현했습니다. 패널에는 각 이벤트의 날짜와 설명이 표시되며 추적 버튼을 통해 이벤트 발생 위치로 카메라를 이동할 수 있습니다.
      문제 상황
      게임 도중 이벤트가 연속적으로 발생할 수 있기 때문에, 매번 로그 UI를 생성/삭제하는 방식은 성능 저하로 이어질 수 있다고 판단했습니다. 또한 로그는 정해진 시간이 지나면 곧 사라지기 때문에 플레이어가 메시지를 놓칠 우려가 있었고 이벤트 발생 위치를 파악할 수 있는 보조 수단이 있으면 시뮬레이션 게임 특성상 상태 파악에 용이할 것이라 생각했습니다.
      해결 방안
      한 줄짜리 로그 UI들을 여러개 미리 인스턴싱한 후, 앞선 팝업 UI와 마찬가지로 Obejct Pooling 방식으로 재사용하여 성능 부담을 최소화했습니다. 각 로그에는 날짜 정보와 함께 이벤트 메시지를 표시하며 추적 버튼을 눌렀을 때 해당 위치로 카메라가 즉시 이동할 수 있도록 CameraManager와 연동하였습니다. 또한 LogUI는 HUD 상단에 가장 최근 이벤트 한 줄만을 표시하며, 새로운 이벤트가 발생할 때마다 내용만 갱신하도록 구성해 집중할 수 있도록 하였습니다.
    • 정보 팝업

      기능 설명
      게임 내 캐릭터, 건물, 구조물 등의 오브젝트를 클릭하면 해당 정보를 화면 위에 팝업 형태로 보여주는 UI 시스템을 구현하였습니다. 팝업은 오브젝트의 ID와 타입을 바탕으로 정보를 조회한 뒤, 적절한 위치에 배치되어 플레이어가 필요한 정보를 빠르게 확인할 수 있도록 구성하였습니다. 또, 외부 시스템에서 해당 오브젝트의 정보가 변경되었을 경우, 팝업을 실시간으로 갱신할 수 있도록 시그널 기반 구조를 도입하였습니다.
      문제 상황
      오브젝트를 클릭할 때마다 팝업을 새로 생성한다면, 프레임 저하, 메모리 과부하를 방지하기위해 UI 생성을 제한하는 방법을 고안해야 했습니다. 또한 동일한 오브젝트를 여러 번 클릭할 경우 중복된 팝업이 생성될 수 있으므로 이 부분도 고려해야 했습니다.
      해결 방안
      모든 팝업을 게임 시작 시 10개 미리 생성하여, 사용 가능한 팝업과 사용 중인 팝업으로 나누어 관리하는 Object Pooling 방식을 도입하였습니다. 또한 이미 동일한 오브젝트에 대한 팝업이 존재할 경우 새로 생성하지 않고, 해당 팝업을 계층 최상단으로 이동시켜 맨 앞으로 렌더링하게하여 재사용성과 유연한 경험을 확보하였습니다. 팝업 위치는 기존 팝업 위치를 기준으로 오프셋을 더해 자동 배치되도록 하여 UI가 자연스럽게 정렬되도록 구현하였습니다.
    • 선택형 메뉴 버튼

      기능 설명
      게임 하단의 MenuUI를 통해 ‘주민’, ‘건축’, ‘연구’, ‘메뉴’ 등 상위 메뉴를 구성하고, 클릭 시 하위 메뉴가 열리도록 구현하였습니다. 예로 ‘건축’ 메뉴에서는 하위 메뉴로 ‘건설’과 ‘설치’가 존재하며, 각각의 상황에 맞는 선택형 버튼 UI들이 출력됩니다. 유저가 버튼을 클릭하면 해당 오브젝트가 설치 모드로 진입됩니다.
      문제 상황
      다양한 상황에 맞는 선택형 버튼들이 존재했기 때문에, 하위 메뉴 클릭 시 이전 버튼들이 그대로 남지 않도록 깔끔하게 관리하고자 했습니다. ‘건설’과 ‘설치’는 모두 오브젝트 생성이라는 공통된 기능을 수행하지만, 하나는 건물이고 하나는 구조물이기 때문에 각기 다른 데이터를 보여줘야 했습니다.
      해결 방안
      UI를 매번 새로 생성하기보다, 미리 만들어둔 버튼들을 상황에 맞게 재활용하면 유지보수가 쉬울 것이라 판단했습니다. ‘건설’과 ‘설치’ 메뉴는 동일한 UI 컴포넌트를 사용하되, 내부 데이터만 바꿔주는 방식으로 구현하여 코드 재사용성과 확장성을 높였습니다. 버튼 클릭 시 내부 로직에 따라 설치할 오브젝트 정보를 전달받고, 이후 드래그 및 설치 흐름으로 자연스럽게 연동되게 하였습니다.
    • 마을 정보 HUD

      기능 설명
      게임 상단에 항상 표시되는 마을 정보를 출력하는 HUD UI를 구현하였습니다. UI는 마을 이름, 현재 자산, 시간 정보를 실시간으로 출력하며, 마을 이름은 직접 수정할 수 있습니다. 시간과 자산은 게임 진행과 함께 자동으로 갱신됩니다.
      문제 상황
      게임이 실시간으로 진행되기 때문에 HUD 정보를 항상 확인할 수 있어야 했습니다. 시간, 자산과 같은 핵심 정보는 별도의 조작 없이 즉시 확인할 수 있어야 하며, HUD가 화면에 고정되어 일관되게 표시되어야 한다는 점도 고려해야 했습니다.
      해결 방안
      마을 정보 UI를 CanvasLayer의 상단 고정 UI로 배치하고, _process() 루프를 통해 시간과 자산 정보를 실시간으로 갱신하였습니다. 마을 이름은 별도의 Edit 버튼을 통해 수정할 수 있도록 구성하였으며, 변경된 이름은 즉시 화면에 반영되도록 처리했습니다.
    • 텍스트 입력 팝업

      기능 설명
      게임 내에서 마을 이름 변경 등 중요한 행동을 요청할 때 사용되는 확인창 UI를 구현했습니다. 타이틀, 안내문, 입력 힌트, 버튼 텍스트 등을 매개변수로 받아 상황에 맞게 커스터마이징할 수 있도록 설계했습니다.
      문제 상황
      기획 단계에서 이 창이 쓰일 곳은 마을 이름을 변경할 때 뿐이었으나, 기능이 확실한 UI인 만큼 사용처가 늘어날수록 일관된 UX를 유지하기 위해, 재사용 가능한 단일 컴포넌트로 정리하는 편이 좋겠다고 생각했습니다.
      해결 방안
      하나의 ConfirmationDialog UI를 미리 구성해두고, init_confirmation_dialog() 함수에 title, 안내문, 입력 힌트, 버튼 텍스트 등을 매개변수로 전달받는 방식으로 구성했습니다. 이렇게 함으로써 방식으로 구성했습니다. 이렇게 함으로써 다양한 상황에 하나의 팝업으로 대응 방식으로 구성했습니다. 이렇게 함으로써 할 수 있었고, UI의 일관성과 유지 보수성도 함께 확보할 수 있었습니다.
  • Message of the Strategy

    Unity 2024
    • 장르 : 실시간 전략 시뮬레이션
    • 참여 인원 : 4인
    • 개발 환경 : Unity
    • 개발 기간 : 2024.09. - 2024.12.

    《Message of the Strategy》는 자연어로 유닛에게 명령을 내리는 실시간 전략 게임(RTS)입니다. GPT 기반 명령 해석 시스템을 도입해 키보드, 마우스를 이용한 복잡한 조작 없이 전략적 판단에 집중할 수 있도록 설계했습니다. 2025년 2학기 학부 졸업 프로젝트이며 교내 '2024 건국대학교 컴퓨터공학과 졸업 프로젝트/논문 우수상'을 수상하였습니다.

    구현 담당 파트

    • UI 통합 제어

      기능 설명
      게임 내 모든 UI 요소를 중앙 제어하는 UIManager를 구현하였습니다. 미니맵, 체력 바, 분대 정보, 시간 UI, 명령 처리 상태, 애니메이션 버튼 등 여러 하위 UI 시스템과 연동하며, 실시간 인터랙션 및 사용자 피드백을 시각적으로 관리합니다.
      문제 상황
      프로젝트 초기에는 각 UI 컴포넌트가 개별적으로 초기화되고 Update()를 따로 구현하는 방식이었고 이로 인해 어떤 UI가 먼저 초기화되는지 명확하지 않아 null 참조 에러가 발생하거나, UI가 늘어날수록 어떤 UI가 어떤 타이밍에 작동하는지 파악하기 어려워지고 새로운 UI를 추가하거나 수정할 때 매번 흐름을 고려해야 하는 등 유지보수 및 확장에 어려움을 느꼈습니다.
      해결 방안
      모든 UI는 초기화 인터페이스 IUIComponent와 업데이트 인터페이스 IUpdatable를 필요에 따라 구현하고 UIManager는 이들을 통합적으로 관리하여 UI 제어 흐름을 한 곳으로 집중시켰습니다. 결과적으로 UI의 초기화 흐름과 업데이트 흐름을 명확하게 분리하고, 다양한 UI 요소가 유연하게 추가되더라도 구조의 안정성과 유지보수성을 유지할 수 있는 기반이 되었습니다.
    • 미니맵 UI

      기능 설명
      게임 내 전장의 흐름을 한눈에 파악하고, 특정 유닛이나 분대로 빠르게 접근할 수 있도록 하기 위해 미니맵 UI를 구현하였습니다. 플레이어는 미니맵을 통해 실시간 위치를 확인하거나 미니맵을 클릭 및 드래그하여 직접 카메라를 조작할 수 있으며, 버튼 클릭만으로 특정 분대로 바로 시점을 이동할 수 있습니다.
      문제 상황
      고민한 부분은 좌표계 처리였습니다. 미니맵 UI는 RectTransform 기준의 좌표계를 사용하고, 실제 게임 내 유닛과 카메라는 Unity의 월드 좌표계를 사용합니다. 이 두 좌표계의 기준점 크기 단위같은 성질이 모두 달라 보았을 때 서로 정확히 일치시키는 것이 쉽지 않았습니다. 특히 미니맵에서 클릭했을 때 기대한 위치로 카메라가 이동하지 않거나, 미니맵 상에 표시된 카메라 시야 영역(BoundingBox)이 실제 화면과 다르게 보이는 문제, 월드 카메라의 시야각(FOV), 높이, 화면 비율에 맞지 않는 미니맵 바운딩 박스 등 면밀히 수정해야하는 부분이 많았습니다. 이 과정에서 바운딩 박스의 크기를 수학적으로 계산하고 UI상 위치를 동기화하는 데 많은 시간을 소모했습니다.
      해결 방안
      먼저 각 유닛의 월드 좌표를 정규화한 뒤,미니맵 UI 크기에 맞춰 스케일링하여 아이콘을 표시하는 구조를 구현하였습니다. 미니맵 클릭 시 월드 좌표로의 정확한 매핑이 가능하도록 좌표를 클램핑하고, 카메라 이동 후에는 바운딩 박스를 함께 이동시켜 시야 영역을 동기화하였습니다. 바운딩 박스 크기는 메인 카메라의 시야각과 높이를 기반으로 월드 시야의 실제 너비·높이를 계산한 뒤, 미니맵 크기에 맞춰 비례 변환하여 적용하였습니다. 그 결과 미니맵에서 보이는 시야와 실제 카메라 시점을 일치시킬 수 있었습니다.
    • 체력 표시 UI

      기능 설명
      전투에서 유닛의 상태를 직관적으로 파악할 수 있도록 게임 내 모든 유닛 및 분대 건물에 실시간 체력바를 표시하는 시스템을 구현하였습니다. 각 분대의 현재 체력을 상단에 떠 있는 UI로 시각화하며 전투 중 체력이 감소하거나 회복될 때 이를 즉시 반영합니다.
      문제 상황
      게임 내 유닛과 건물은 각기 다른 크기와 스케일을 가지고 있어서, 체력바를 일괄적으로 같은 위치에 띄우는 방식으로는 머리 위에 정확히 정렬되지 않는 문제가 있었습니다. 특히 키가 크거나 작거나, 중심점이 다른 오브젝트에 동일한 Y 오프셋을 주면 시각적으로 어긋나는 현상이 자주 발생했고 이로 인해 유닛별로 실제 화면에 표시되는 체력바 위치가 들쑥날쑥해졌습니다.
      해결 방안
      각 유닛이 가진 실제 높이를 기준으로 체력바 위치를 계산하기 위해 유닛이 등록될 때 한 번만 Renderer.bounds.size.y값을 계산 하여 이를 Hp 객체를 키로 하는 딕셔너리에 캐싱해두었습니다. 그 후 Update 시점에서는 캐싱된 값을 불러오고 거기에 오프셋을 적용해 위치를 계산함으로써 각 유닛의 시각적 높이에 맞는 위치에 체력바가 안정적으로 배치되도록 처리하였습니다.
    • 분대 정보 UI

      기능 설명
      게임 내 전략 단위인 ‘분대(Squad)’의 상태를 직관적으로 파악할 수 있도록, 각 분대의 이름, 유닛 구성, 체력, 공격력, 방어력, 이동 속도 등의 정보를 표현하는 UI를 구성하였습니다 또한 미니맵과 연동하여 버튼 클릭을 통한 분대 포커싱 카메라 이동, 체력 게이지 실시간 업데이트 등 게임 흐름에 필요한 전략적 판단을 지원하는 역할을 하도록 구현하였습니다.
      문제 상황
      게임 내 분대 정보는 UnitManager를 통해 실시간으로 구성되기 때문에, 분대가 변경되거나 유닛이 사망하는 경우에도 UI에 즉시 반영될 수 있는 구조가 필요했습니다. 또한 UI 버튼과 실제 분대 간의 연결을 어떻게 안정적으로 매핑할 것인지 실시간 체력 변화와 같은 정보는 어느 타이밍에 갱신할 것인지 등의 처리 흐름도 명확히 정리되어야 했습니다.
      해결 방안
      이에 따라 초기화 시점에 UnitManager로부터 모든 분대 정보를 받아와 분대 ID를 키로 하는 딕셔너리(Dictionary<int, Squad>) 형태로 정리하고, 버튼 리스트의 인덱스와 매핑하여 클릭 시 해당 분대 리더의 위치로 카메라를 이동하고 UI 정보를 갱신하는 흐름으로 구성했습니다. 기능 자체는 비교적 단순했지만, UI와 게임 데이터 간의 흐름이 어긋날 경우 쉽게 오류가 발생할 수 있는 구조였기 때문에 초기화 타이밍과 갱신 흐름을 명확히 분리하고, 각 역할을 나눠 작동할 수 있도록 설계에 집중하였습니다.
    • 카메라 이동

      기능 설명
      게임 플레이 중 전장을 자유롭고 빠르게 탐색할 수 있도록 WASD 키 이동과 마우스 우클릭 회전을 지원하는 RTS 스타일의 자유 시점 카메라 컨트롤러를 구현하였습니다. 플레이어는 언제든지 카메라를 움직여 유닛 주변을 둘러보거나 전장을 탐색할 수 있습니다.
      문제 상황
      카메라 기능 자체는 단순했지만 여러 고려사항이 존재했습니다. 대표적으로 미니맵 클릭이나 버튼 조작 중에도 WASD 입력이 동시에 작동해 시점이 원치 않게 움직이는 경우가 있었으며 이러한 UI와의 입력 충돌 문제를 방지할 필요가 있었습니다. 또한, 초기 구현 단계에서는 카메라 이동이 즉각적이고 뚝뚝 끊기는 느낌이 있어 조작감이 거칠게 느껴졌고, 좀 더 부드러운 느낌이 필요하다고 판단했습니다. 무엇보다 중요한 고민은 카메라와 미니맵 간의 시야 동기화 문제였습니다. 카메라가 수동으로 움직였을 때, 미니맵에서 표시되는 시야 영역(바운딩 박스)도 함께 이동해야 플레이어가 미니맵과 실제 시야를 일관되게 인식할 수 있었습니다.
      해결 방안
      UI 입력과의 충돌 문제는 EventSystem.current.IsPointerOverGameObject() 조건을 활용하여 마우스가 UI 위에 있을 경우 카메라 조작을 차단함으로써 안정적인 경험 확보하였습니다. 카메라 이동의 조작감은 acceleration, deceleration 값을 조정하여 가속/감속 기반의 부드러운 이동을 구현하였고, 카메라 위치가 변경되었을 때 그 위치를 정규화하여 미니맵의 바운딩 박스도 함께 이동시킴으로써 미니맵과 실제 카메라 시야를 연동시켜 전체 맵과 시점을 혼동 없이 자연스럽게 탐색할 수 있게 되었습니다.
    • 오브젝트 배치

      기능 설명
      게임 씬에 숲, 나무 등 배경 오브젝트를 자연스럽게 배치하기 위해 클러스터 기반 랜덤 배치 시스템을 구현했습니다. 각 클러스터는 랜덤한 위치에 생성되며, 해당 클러스터 내부에 여러 개의 오브젝트가 일정 반경 내에 배치됩니다. 이를 통해 규칙적이지 않으면서도 밀도감 있는 배경 배치를 가능하게 했습니다.
      문제 상황
      초기에는 Random.Range()로 위치만 랜덤하게 생성했으나, 그 결과 나무들이 맵 전역에 고르게 퍼지지 못하고 어색하게 분포되거나 중앙 캐릭터 근처까지 침범하는 문제가 발생했습니다. 또한 오브젝트를 단순히 평면 상에 배치하면 경사 지형이나 건물 위에 떠 있거나 박히는 경우가 생겨 지형을 정확히 인식하여 오브젝트를 자연스럽게 배치하는 기능이 필요했습니다.
      해결 방안
      먼저 클러스터 중심 위치를 랜덤으로 선정하되, 중심으로부터 일정 반경 내에서만 오브젝트를 배치하도록 하여 밀도 있는 군집 형태의 자연스러운 배경을 연출했습니다. 각 오브젝트 배치 시, 위쪽에서 아래 방향으로 Physics.Raycast()를 사용해 실제 지형의 높이를 감지한 후 hit.point에 배치함으로써 지면 위에 정확하게 배치되도록 하였습니다. 다양한 배경 프리팹 중 무작위 선택을 통해 시각적 반복을 최소화하였고, 배치 시 약간의 크기 조정을 추가해 더욱 자연스러운 결과에 신경 썼습니다.

영향을 준 게임들

- 아동기

  • 파랜드 택틱스 1, 2
    SRPG 1996-1997
    파랜드 택틱스 1, 2 썸네일
  • 악튜러스
    RPG 2000
    악튜러스 썸네일
  • 일랜시아
    MMORPG 1999
    일랜시아 썸네일
  • 마비노기
    MMORPG 2004
    마비노기 썸네일
  • 편의점
    TYCOON 2000
    편의점 썸네일
  • 코코룩
    TYCOON RPG 2002
    코코룩 썸네일
  • 믹스마스터
    RPG 2003
    믹스마스터 썸네일
  • 테일즈위버
    MMORPG 2005
    테일즈위버 썸네일

- 청소년기 및 성인기

  • 마비노기 영웅전
    액션RPG 2010
    마비노기 영웅전 썸네일
  • 트리 오브 세이비어
    MMORPG 2018
    트리 오브 세이비어 썸네일
  • 데스스트랜딩
    시네마틱 어드벤처 2019
    데스스트랜딩 썸네일
  • 마비노기 모바일
    MMORPG 2025
    마비노기 모바일 썸네일

좋은 개발자란

마비노기 모바일 낚시 스크린샷

저는 어린 시절부터 성인이 된 지금까지, 숱한 시간을 게임과 함께해 왔습니다. 친구들과 함께 또는 혼자서도 수없이 몰입하고 즐거워했던 그 시간들은 순간의 재미 이상으로 저에게 소중한 기억이 되었습니다. 그래서 이제는 그런 ‘재미있고 누군가의 추억이 되는 게임’을 만드는 사람 중 한 명이 되고 싶습니다.

작은 프로젝트들을 수행하며, 저는 개발자로서 두 가지 가치를 가장 중요하게 여기게 되었습니다. 첫 번째는 <항상 팀원과 소통하며 오해 없는 투명한 개발>입니다. 가끔 기억에 의지하다보면 프로젝트 도중 '이거 이렇게 하기로 하지 않았던가?' 싶은 상황이 종종 발생했고, 이는 중요한 자원인 '시간'을 낭비하게 될 뿐 아니라 팀의 사기와 팀원간의 신뢰에도 부정적인 영향을 주었습니다. 그래서 저는 명확한 커뮤니케이션과 문서화, 합의된 내용을 모두가 이해할 수 있도록 정리하는 습관을 중요하게 생각합니다.

두 번째는 <포기하지 않고 꾸준히 정진하는 개발>입니다. 도전적인 기능을 구현하다 보면 몇 시간 동안 시행착오를 반복하며, 제자리걸음을 하는 느낌에 좌절할 때도 많았습니다. 하지만 그런 때일수록 기능 개발이 아니더라도 리팩토링이나 작은 개선이라도 진행하면서 흐름을 놓지 않도록 노력했고 그렇게 유지한 몰입 속에서 새로운 아이디어가 떠오르기도 했습니다.

물론 실무에서의 개발 경험은 적지만, 게임을 향한 깊은 애정과 이해는 제가 가진 큰 강점입니다. 직접 게임의 인터페이스를 구현하며 기획자, 아티스트와의 협업의 중요성을 절실히 느꼈고, 그 이해를 바탕으로 긍정적이고 명확한 소통과 성실한 구현을 수행할 것입니다. 데브캣에 입사하게 된다면 좋아하는 일을 하며 진심으로 몰입하고 그 열정을 실력으로 바꾸어 팀에 보탬이 되는 개발자가 되겠습니다.

감사합니다.