김승민 작업물 · We Bare Bears the Puzzle, Unbound, FarmQuest

← 작업물 목록
01 /

We Bare Bears the Puzzle

월드맵 기획 · 미션 연출 · 시나리오

위 베어 베어스 IP 기반 퍼즐 게임의 월드맵 미션·시나리오 담당

2018년 5월부터 2023년 3월까지 위베베팀에서 컨텐츠 기획을 맡아, 월드 파트 및 퍼즐 파트를 담당했다.

담당 범위
  • 월드맵 미션 연출: Lua 스크립팅으로 캐릭터·카메라 움직임 및 대사 제어
  • 월드맵 기획: 아트·사운드팀과 협업해 원화 및 필요 리소스 정리, 시즌 3·4 및 이벤트 맵 제작
  • 시나리오 작성: 스크립트 집필 및 원작 IP 위배 여부 검수
  • 리소스 제작·관리: Unity 인하우스 플러그인으로 레벨 제작, 컴포넌트로 오브젝트 제작
  • 데이터 테이블 세팅: 맵·미션·NPC·대사·오브젝트 데이터 세팅 및 배포
  • 3Match 퍼즐 레벨 디자인 및 라이브 밸런싱
  • 스토리 검수 빌드 관리: 워너브라더스 아시아태평양 지사 검수 대응 및 일정 관리
플랫폼 모바일 (iOS / Android)
엔진 Unity3D
주요 역할 시나리오, 미션 연출, 데이터 세팅
스크립팅 Lua
심층 케이스

놈놈 저택 · 가방 되찾기 미션

1 광장 2 놀이터 3 테니스장 4 주차장
디자인 의도

악당 추적 스토리에서 자연스럽게 맵을 순회하도록 미션을 배치. 새로운 장소로 이동하기 전에 유저들이 직접 꾸민 공간을 한 번 더 둘러보게 하여, 이야기 마무리와 공간적 완결감을 동시에 제공한다.

한 파트의 미션 전체를 단독으로 설계한 사례다. 시나리오 집필과 미션 연출을 전담하며, 플레이어 동선·감정 곡선·IP 세계관 세 가지 제약을 동시에 만족하는 구조로 설계했다.


아이스베어 탐문 장면: 대화 능력이 부족한 아이스베어가 탐문을 맡는 상황을 설정. 대화가 어긋나는 것처럼 보이지만 결과적으로 원하는 정보에 도달하는 방식으로 개그를 유도했다.


아이들 오해 장치: 이전 스토리에서 어른들이 아이들의 놀이터를 철거하려 한 맥락을 활용. 악당을 철거하러 온 어른으로 오해하게 만들어서 아이들과 자연스러운 협력 구도를 형성했다.


캐릭터 역할 분배: 제일 약한 판다가 재치로 악당을 검거하는 장면 구성을 위해 제일 강한 아이스베어는 기습으로 무력화, 그리즐리는 추격당하는 상태로 설정해 서사적 공간을 확보했다.

그리즐리 그리즐리 악당에게 쫓기는 상태
아이스베어 아이스베어 기습으로 무력화
판다 판다 재치로 악당 검거

쿼터뷰 연출 변형: 원작의 몰래 접근하는 장면은 쿼터뷰에서 그대로 표현하기 어려워, 순간이동 연출로 변형해 적용했다.

인게임 장면
원작 참고 장면
원작 장면 참고

원작에서는 아이들이 범인을 붙잡으나, 게임에서는 주인공이 직접 잡는 것이 클라이맥스에 맞다고 생각하여 각색. 하지만 곰들이 직접 사람을 공격하는 것은 원작의 성격과 맞지 않아, 테니스공 발사기라는 도구를 활용한 간접 공격 연출로 대체했다.

역할 시나리오 + 연출
핵심 스킬 IP 해석, 동선 설계, 장면 연출
구역 3번째 구역 · 놈놈 저택
02 /

Unbound

UE5 Blueprint를 활용한 쿼터뷰 1인 개발 프로토타입. 캐릭터 이동, NPC 인터랙션, 대화 시퀀스, 퀘스트 수락 등 게임 로직 전반을 Blueprint로 구현했다.

레벨 에셋은 Unreal Marketplace에서 조달. 캐릭터 이미지는 GPT Image로 생성한 뒤 Photoshop으로 가공했고, 사운드는 Audacity로 편집했다.

제작년도 2024
형태 프로토타입
엔진 / 스크립트 Unreal Engine 5 / Blueprint
도구 Blender, Photoshop CC, Audacity, GPT Image
AI 설계

보스 AI

보스 캐릭터의 AI를 Behavior Tree와 Blackboard로 설계했다. 상태 기반(Passive / Investigating / Attacking) 분기 구조로, HP 페이즈에 따라 공격 패턴이 전환된다.

Behavior Tree

루트 Selector에서 AI 상태별로 분기한다. Passive 상태에서는 순찰/배회, Investigating 상태에서는 마지막 감지 위치로 이동, Attacking 상태에서는 거리와 HP에 따라 공격 패턴을 선택한다.

보스 Behavior Tree 전체 구조
보스 Behavior Tree - Passive / Investigating / Attacking 3단계 상태 분기 구조
Blackboard

Blackboard에 6개 키를 정의하여 AI 판단에 사용한다. AIPerception으로 플레이어를 감지하면 AttackTarget과 State를 갱신하고, Decorator가 이 값을 읽어 행동을 분기한다.

키 타입 용도
AttackTarget Object 현재 공격 대상 (플레이어)
State Enum AI 상태 (Passive / Attacking / Investigating)
PointOfInterest Vector 조사할 관심 지점
LastKnownLocation Vector 타겟 마지막 위치
보스 Blueprint EventGraph
BP_GhostCharacter EventGraph - 피격 반응, 상태 전환, 사망 처리 등 보스 캐릭터 로직
공격 패턴

각 공격 패턴의 인게임 동작

일반 전투
보스 Swing 공격
Swing - 근접 휘두르기. 플레이어가 접근 거리에 있을 때 기본 근접 공격으로 사용.
보스 Charge 돌진 공격
Charge - 중거리 돌진. 바닥 방향 지시자로 돌진 경로를 표시하고 돌진.
보스 Smash 내려찍기
Smash - 광역 내려찍기. 근접 범위 내 플레이어에게 AoE 데미지.
보스 RangeAttack 원거리 공격
RangeAttack (Orb / Blackhole) - 원거리 공격. Orb 투사체 발사 또는 유도 투사체 발사.
격노 페이즈 (HP 임계치 이하)
보스 Summon 미니언 소환

Summon

HP 임계치 이하로 진입하면 텔레포트 후 Skeleton Knight + Archer 미니언을 최대 6체 소환한다.

1vs1의 단조로운 패턴을 피하기 위해 미니언을 소환하고 원거리 공격으로 압박을 한다.

구현 상세

플레이어 조작과 전투

이동, 공격, 구르기, NPC 대화까지 플레이어가 직접 조작하는 동작 전체를 Blueprint로 구현했다.

플레이어가 할 수 있는 것
동작 설명
이동 입력한 방향으로 캐릭터가 움직인다.
3단 콤보 공격 공격 버튼을 타이밍에 맞춰 연속으로 누르면 1타, 2타, 3타로 이어진다.
구르기 적의 공격을 피하는 회피 동작.
NPC 대화 NPC 앞에서 상호작용 키를 누르면 말풍선으로 대화가 열린다.
플레이어 Blueprint - 전투 로직
플레이어 Blueprint - 콤보 공격, 자동 조준, 피격 반응
플레이어 Blueprint - 이동 및 인터랙션 로직
플레이어 Blueprint - 이동, 구르기, NPC 대화
03 /

FarmQuest

FarmQuest는 기획자가 코드를 건드리지 않고 퀘스트를 추가할 수 있는 데이터 구조를 설계 했다. 이를 위해 퀘스트와 캐릭터 정보 등을 JSON으로 분리하여 JSON 파일 수정과 레벨 SCENE 수정만으로 퀘스트를 추가 가능.

디자인 의도

퀘스트를 하나 더 만드는 일이 프로그래머의 일정에 걸리지 않게 한다. 기획자가 데이터 파일을 추가하는 것만으로 NPC의 반응, 대화, 퀘스트 흐름이 바뀌는 구조를 검증한다.

제작년도 2026
형태 프로토타입
사용 툴

Unity 6 · GPT Image · Adobe Photoshop · Meshy AI · ElevenLabs · Audacity · Cursor AI

상세 자료

필드 정의와 타입, 시작 조건과 목표 타입, 퀘스트 흐름도와 페이즈 구성, 전체 대사는 소개 문서에 정리했다. 아래는 페이지에 담은 요약이다.

퀘스트 데이터

퀘스트를 주는 NPC, 시작 조건, 목표, 보상 등 퀘스트에 필요한 정보를 데이터로 관리한다. 오른쪽은 실제 적용 데이터인 "진할머니의 감자스튜 레시피" 퀘스트.

항목 설명 필드명
퀘스트 ID 퀘스트를 참조할 때 쓰이는 고유 ID id
제목 / 설명 텍스트를 직접 넣지 않고 로케일 ID만 참조. 언어 설정에 따라 자동 출력 titleId
descriptionId
제공 NPC 시작 조건 달성 시 NPC 머리 위에 ! 표시, 대화에 임무 선택지 추가 providingNPCId
완료 NPC 모든 목표 완료 시 NPC 머리 위에 ? 표시, 대화에 임무 완료 선택지 추가 completionNPCId
시작 조건 여러 조건을 넣을 수 있고, 모두 충족하면 퀘스트 시작 가능 startConditions
수락 / 완료 대화 NPC 대화에서 임무를 선택하면 재생. 대화가 끝나면 퀘스트 시작 또는 완료 startDialogueId
completionDialogueId
목표 순서대로 진행. 모든 목표 완수 시 퀘스트 완료 objectives
보상 완료 대화가 끝나는 시점에 자동 지급 rewards

시작 조건은 선행 퀘스트 완료 여부, 플래그 값, 아이템 보유 수량 세 가지를 검사한다. 목표는 지역 도달, 대화 완료, 적 처치, 아이템 수집 네 가지 타입이 있다. 감자스튜 퀘스트는 마르타와 대화 → 밭으로 이동 → 잡초 4개 수집 → 마르타와 대화 → 로이에게 레시피 전달, 5단계로 구성했다.

{
  "id": "quest_potatostew_01",
  "titleId": "Quest_title_potatostew",
  "descriptionId": "Quest_description_potatostew_01",
  "providingNPCId": "npc_roy",
  "completionNPCId": "npc_roy",
  "startConditions": [],
  "startDialogueId": "conv_potatostew_01",
  "completionDialogueId": "conv_potatostew_05",
  "objectives": [ ... ],
  "rewards": [
    { "itemId": "Item_0001", "amount": 100 },
    { "itemId": "Item_0002", "amount": 100 }
  ]
}

대화 데이터

캐릭터 간의 텍스트 대화를 출력한다. 대사 한 줄마다 캐릭터 초상화(감정), 음성, 애니메이션 연출을 지정하고, 대화 종료 시 플래그를 변경해 스토리와 퀘스트 진행을 제어한다.

항목 설명 필드명
대사 출력할 대사의 로케일 ID textId
캐릭터 대사를 하고 있는 캐릭터 characterId
초상화 감정별 초상화 (idle, thinking 등) expression
음성 출력할 캐릭터 음성 voice
애니메이션 대사 중 재생할 캐릭터 애니메이션 animation
플래그 변경 대화 종료 후 변경할 플래그 flagActions

플래그 변경은 설정, 값 증가, 토글, 제거 네 가지. 예시의 로이 기본 대화는 종료 시 potatostew_phase 값을 7로 설정한다.

{
  "id": "conv_roy_default",
  "lines": [
    {
      "characterId": "npc_roy",
      "expression": "idle",
      "textId": "dlg_roy_default_dlg_01",
      "voice": "talk",
      "animation": "Talk_1",
      "flagActions": [
        {
          "type": 0,
          "key": "potatostew_phase",
          "value": 7
        }
      ]
    }
  ]
}

캐릭터 데이터

NPC가 가지고 있는 표정 및 음성 에셋을 데이터로 관리하고, 인삿말과 기본 대화, 플래그 값에 따른 대화를 관리한다. 스토리 진행에 따른 NPC 대사 변화를 별도 코드 없이 데이터로 표현한다.

항목 설명 필드명
캐릭터 ID 대화 및 퀘스트의 NPC 참조에 사용 characterId
이름 이름의 로케일 키 nameKey
인삿말 NPC에게 말을 걸었을 때 표시할 문구 greetingLocaleId
기본 대화 조건에 맞는 대화가 없을 때 재생할 대화 defaultDialogueId
표정 감정 key와 에셋 address 목록 expressions
음성 음성 key와 에셋 address 목록 voices
조건부 대화 플래그 값에 따라 재생할 대화 dialogueConditions
{
  "characterId": "npc_roy",
  "nameKey": "npc_01_name",
  "defaultDialogueId": "conv_roy_default",
  "greetingLocaleId": "NPC_01_interact_01",
  "expressions": [
    { "key": "idle",     "address": "Roy_idle" },
    { "key": "thinking", "address": "Roy_think" }
  ],
  "voices": [
    { "key": "talk", "address": "Roy_talk" }
  ],
  "dialogueConditions": [
    {
      "flagId": "potatostew_phase",
      "state": 1,
      "dialogueId": "conv_potatostew_10"
    }
  ]
}
동작 흐름

플래그로 연결되는 구조

퀘스트, 대화, 캐릭터 데이터는 서로를 직접 호출하지 않고, 플래그를 사이에 두고 연결된다. 플래그는 스토리 진행 상태를 저장하는 값으로, 예시의 potatostew_phase가 감자스튜 퀘스트의 진행 단계를 저장한다.

순서 동작 참조 데이터
1 플레이어가 로이에게 말을 건다 캐릭터
2 현재 플래그 값에 맞는 조건부 대화가 있는지 확인한다 캐릭터 → 플래그
3 조건에 맞는 대화가 있으면 해당 대화를, 없으면 기본 대화를 재생한다 대화
4 대화가 끝나면 플래그 값을 변경한다 대화 → 플래그
5 변경된 플래그 값이 다음 대화와 퀘스트 시작 조건에 반영된다 플래그 → 캐릭터 / 퀘스트