Skip to content

JJH0204/unity-procgen-leveleditor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ProcGen — 절차적 던전 생성 도구 (사용 가이드)

시드(숫자) 하나와 몇 가지 설정만으로 익스트랙션 슈터용 던전(탈출 슈터, Tarkov·Dark and Darker 계열)을 자동으로 만들어 주는 Unity 도구입니다. 코드를 몰라도 메뉴 클릭과 값 입력만으로 지형·몬스터·보상·탈출구가 있는 레벨을 생성할 수 있습니다.


0. 이 도구로 무엇을 할 수 있나요?

  • 버튼 한 번으로 지형(산·평지·길) 과 그 위의 시작점·탈출구·몬스터·보상·보스가 자동 배치됩니다.
  • 같은 시드 + 같은 설정 = 항상 같은 결과. 마음에 든 맵을 시드 숫자로 다시 불러올 수 있습니다.
  • "플레이어가 달려서 60~120초면 탈출구에 도착" 같은 플레이 시간 기준으로 맵 크기가 자동 계산됩니다.
  • 만든 던전이 실제로 끝까지 갈 수 있는지(막힌 길 없는지) 도구가 자동으로 검사합니다.

1. 가장 먼저 — 샘플로 5초 만에 결과 보기

직접 만들기 전에, 미리 준비된 예제를 돌려서 어떤 결과가 나오는지 보세요.

  1. Unity 상단 메뉴에서 Tools ▸ ProcGen ▸ Sample ▸ Setup and Run Test 를 클릭합니다.
  2. 잠시 기다리면 씬(Scene)에 지형과 색색의 표시물이 생깁니다.
  3. 하단 Console 창에 [SampleTest] ... validation=PASS 가 보이면 정상입니다.

이때 생기는 색의 의미:

색/모양 의미
🟦 파란 캡슐 시작점 (플레이어가 입장하는 곳)
🟢 초록 원기둥 탈출구 (여기로 가면 탈출)
🟡 금색 구 보상(전리품)
🔴 빨강 캡슐 일반 몬스터
🟣 보라 캡슐 상급 몬스터(엘리트)
🟥 진한 빨강(큰 것) 보스
⬜ 회색 큐브 엄폐물

💡 결과가 마음에 안 들면 그냥 같은 메뉴를 다시 누르세요. 매번 같은 시드라 같은 결과가 나오고, 시드를 바꾸면(아래 4번) 새로운 맵이 나옵니다.


2. 내 던전 만들기 — 준비물(에셋) 만들기

"에셋"은 설정을 담는 파일이라고 생각하면 됩니다. Project 창에서 마우스 우클릭 ▸ Create ▸ ProcGen ▸ … 로 만듭니다.

만들어야 할 것 (이름은 자유):

  1. Dungeon Profile — 던전 전체 설정을 모으는 메인 파일. (Create ▸ ProcGen ▸ Dungeon Profile)
  2. Movement Profile — 캐릭터 이동 속도. 걷기/달리기 속도를 넣습니다.
  3. Region Partitioner — 맵을 구역(외곽/중간/핵심)으로 나누는 설정.
  4. Extraction Placer — 탈출구 배치 규칙.
  5. Spawn Point Placer — 시작점 배치 규칙.
  6. Terrain Builder — 높이 정보를 실제 지형으로 만드는 설정.
  7. (선택) Interpreters — 몬스터/보상/엄폐물을 뿌리는 규칙. Obstacle Placement, Field Spawner.
  8. (선택) Validators — 검사기. Reachability(길 막힘), Balance(거리), Pacing(이동 시간), Affordance(캐릭터 지원).

가장 빠른 방법: 위를 일일이 만들기 번거로우면 1번 샘플 메뉴를 한 번 실행하세요. Assets/Sample/SO/ 폴더에 위 파일들이 전부 자동으로 만들어집니다. 그걸 복사해서 값만 바꿔 써도 됩니다.


3. 메인 파일(Dungeon Profile) 설정하기

Project에서 만든 Dungeon Profile을 클릭하면 오른쪽 Inspector에 설정이 보입니다. 주요 항목:

  • Master Seed: 맵을 결정하는 숫자. 바꾸면 다른 맵이 됩니다.
  • Scale Mode:
    • TimeBased (추천) — 아래 MovementSpawn To Extraction Time으로 맵 크기를 자동 계산.
    • Manual — World Size(맵 크기)를 직접 숫자로 지정.
  • Movement: 위에서 만든 Movement Profile을 끌어다 넣습니다.
  • Spawn To Extraction Time Seconds: "시작점→가장 가까운 탈출구"까지 걸리길 원하는 시간(초). 예: 60 ~ 120.
  • Stage A — Fields: Height/Risk/Loot Stack 각각에 노이즈 레이어를 1개 이상 넣습니다(지형/위험도/보상 분포). 샘플 값을 참고하세요.
  • Region Partitioner / Extraction Placer / Spawn Point Placer / Terrain Builder: 만든 에셋을 각 칸에 넣습니다.
  • Interpreters / Validators: 몬스터·보상·검사기 에셋들을 목록에 넣습니다.

위험도(Risk)가 높은 곳일수록 몬스터·보스가 모이고, 그 구역은 지형이 평지로 펴져 전투 공간이 됩니다. 시작점↔탈출구 사이에는 길이 자동으로 패입니다.


4. 도구 창에서 생성하기 — Tools ▸ ProcGen ▸ Dungeon Preview

상단 메뉴 Tools ▸ ProcGen ▸ Dungeon Preview 를 열면 작은 창이 뜹니다.

  1. Profile 칸에 내 Dungeon Profile을 끌어다 넣습니다.
  2. 창에 표시되는 Scale 정보로 자동 계산된 맵 크기와 예상 이동 시간을 확인합니다.
  3. 버튼 사용법:
버튼 하는 일
Regenerate Preview 높이/위험/보상/구역 4종 지도를 그림으로 미리보기 (위 탭으로 전환)
Randomize Seed 새 시드로 랜덤. 마음에 드는 게 나올 때까지 누르세요
Generate Layout 시작점·탈출구·POI 위치를 계산해 씬에 표시(기즈모: 🟧POI 🟢탈출 🟦시작)
Validate Layout 막힌 길/거리/시간 문제를 검사해 목록으로 보여줌 (없으면 "All validators passed")
Target Root + Apply to Scene 실제로 씬에 지형과 모든 오브젝트를 생성 (Ctrl+Z로 되돌리기 가능)
Seed Gallery 마음에 든 시드를 저장/복원

실제 맵을 만드는 순서: ① Profile 넣기 → ② Randomize Seed로 원하는 모양 찾기 → ③ Generate Layout으로 배치 확인 → ④ Validate로 문제 없는지 확인 → ⑤ Target Root에 빈 게임오브젝트를 넣고 Apply to Scene.

Target Root: 씬에 빈 게임오브젝트를 하나 만들고(Hierarchy 우클릭 ▸ Create Empty) 그걸 이 칸에 넣으세요. 생성물이 그 아래에 정리되어 들어갑니다.


5. 자주 만지는 값 (지형/난이도 조절)

Terrain Builder 에셋에서:

  • Terrain Height: 지형의 높낮이 정도(작을수록 평평).
  • Path Corridor Width: 자동으로 패이는 길의 폭.
  • Combat Risk Range / Flatten Strength: 어느 정도 위험한 곳부터 평지로 만들지, 얼마나 평평하게 할지.

Spawn / Extraction Placer 에셋에서:

  • Count: 시작점/탈출구 개수.
  • Acceptable Risk Range: 어느 위험도 구간에 배치할지.

Dungeon Profile에서:

  • Spawn To Extraction Time Seconds: 한 판의 길이(이동 시간). 늘리면 맵이 커집니다.
  • Max Regeneration Attempts: 검사 실패 시 시드를 바꿔가며 다시 시도하는 횟수.

6. 자주 묻는 상황

  • "validation=PASS가 안 떠요 / unreachable 이 나와요" → 지형이 너무 가파르거나(Terrain Height를 낮추세요) 시작점·탈출구가 맵 끝에 너무 붙은 경우입니다. Apply를 다시 누르면 시드를 바꿔가며 자동 재시도합니다.
  • "오브젝트가 너무 많아요" → Interpreter(Obstacle/Field Spawner)의 threshold(임계값) 를 올리거나 density(밀도) 를 낮추세요.
  • "같은 맵을 다시 보고 싶어요" → Seed Gallery에 저장하거나 Master Seed 숫자를 적어두세요.

7. 용어 사전

  • 시드(Seed): 맵을 결정하는 숫자. 같으면 같은 맵.
  • 필드(Field): 맵 전체에 깔린 값의 지도. Height=높이, Risk=위험도, Loot=보상, Region=구역.
  • POI: 주요 거점(보스방·시설 등).
  • NavMesh: 캐릭터가 걸어다닐 수 있는 영역. 이게 끊기면 "갈 수 없는 길"이 됩니다.
  • 어포던스(Affordance): 엄폐물·고지대처럼 특정 플레이스타일에 필요한 환경 요소.

(개발자용) 설치 / 구조

Assets/ProcGen/ 폴더를 프로젝트에 복사하면 끝입니다.

  • 어셈블리 분리: ProcGen.Runtime(외부 패키지 하드 의존 없음) / ProcGen.Editor(에디터 전용, 빌드 제외).
  • NavMesh 검증은 내장 UnityEngine.AI 모듈 사용(별도 패키지 불필요). 외부 라이브러리 FastNoise Lite는 충돌 방지를 위해 Game.ProcGen.ThirdParty 네임스페이스로 포함.
  • 결정론: 모든 난수는 시드 기반 System.Random으로 전파(UnityEngine.Random·시간 의존 금지) — 멀티플레이 동기화 안전.
  • 엔진: Unity 6000.3.12f1 + URP.
  • 파이프라인: A(필드) → B(POI/배치) → C(절차적 채움) → D(검증) → E(지형·적용). 진입점: DungeonProfile.GenerateFields() / GenerateLayout() / Generate(sceneRoot).

About

Noise-based procedural extraction-shooter level generator for Unity (editor tool + runtime, deterministic, terrain/NavMesh aware)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages