← 작업물 목록
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에 따라 공격 패턴을 선택한다.

공격 패턴사거리설명
Swing / Slam근접기본 근접 공격 콤보
Charge중거리돌진 후 텔레포트 연계
Orb Shoot원거리마법 투사체 2연발
Blackhole원거리유도 투사체 + 데미지
Summon자체HP 페이즈 시 미니언 6체 소환
보스 Behavior Tree 전체 구조
보스 Behavior Tree - Passive / Investigating / Attacking 3단계 상태 분기 구조
Blackboard

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

타입용도
AttackTargetObject현재 공격 대상 (플레이어)
StateEnumAI 상태 (Passive / Attacking / Investigating)
SelfActorObject자기 자신 참조
PointOfInterestVector조사할 관심 지점
LastKnownLocationVector타겟 마지막 위치
LastLocationVector이전 위치 (이동 추적용)
보스 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

기획자가 코드를 건드리지 않고 퀘스트를 추가하고 수정할 수 있는 데이터 구조를 설계한 프로토타입. 퀘스트, 대화, 캐릭터를 각각 JSON으로 분리하고 플래그로 연결했다.

이미지, 사운드, 3D 모델, 코드 작성에는 생성형 AI 툴을 활용했다.

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

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

상세 자료

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

퀘스트 데이터

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

항목설명필드명
퀘스트 ID퀘스트를 참조할 때 쓰이는 고유 IDid
제목 / 설명텍스트를 직접 넣지 않고 로케일 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 }
  ]
}

대화 데이터

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

항목설명필드명
대사출력할 대사의 로케일 IDtextId
캐릭터대사를 하고 있는 캐릭터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변경된 플래그 값이 다음 대화와 퀘스트 시작 조건에 반영된다플래그 → 캐릭터 / 퀘스트