오늘은 Claude와 함께 게임의 뼈대가 될 데이터 시스템을 대대적으로 확장했습니다.
기능 구현보다 앞서 데이터 구조가 탄탄해야 나중에 콘텐츠를 채울 때 손이 덜 가기 때문입니다. 신규 ScriptableObject 5개 신설, 기존 핵심 파일 5개 수정 — 오늘 작업 기록을 남깁니다.
1. 🦅 GridCell — 비행/수중 이동 타입 지원
SRPG에서 비행 유닛(드래곤, 페가수스 등)이나 수중 유닛(해적, 인어 등)을 넣으려면 기존 isWalkable 하나로는 부족합니다.
💡 해결 방법
GridCell.cs에 이동 타입별 프로퍼티를 추가했습니다.
// 물 지형 여부 (수중 유닛 전용)
public bool isAquatic => terrainData != null && terrainData.type == TerrainType.Water;
// 비행 유닛: 점유 유닛만 막힘 (지형 무시)
public bool isWalkableForFlying => occupyingUnit == null;
// 수중 유닛: 물/평지만 이동 가능
public bool isWalkableForAquatic => occupyingUnit == null &&
(terrainData == null || terrainData.type == TerrainType.Water || terrainData.type == TerrainType.Plain);
GridManager.GetMovableCells() 도 오버로드를 추가해서 Ground / Flying / Aquatic 세 가지 이동 타입에 따라 BFS 분기가 달라지도록 구현했습니다. 기존 코드와 완전 하위 호환됩니다.
2. 📋 JobData ScriptableObject 신설 — 직업 시스템 기반 설계
기존에는 JobGrowthData(성장치 전용)만 있었는데, 직업 자체를 표현하는 데이터가 없었습니다.
💡 새로 만든 것
JobData.cs — 직업 한 개를 완전히 정의하는 ScriptableObject.
- 기본 스탯 (LV1 초기값 HP/MP/ATK/DEF/MATK/MDEF/SPD)
- 이동 타입 (Ground / Flying / Aquatic)
- 허용 장비 타입 (검사는 검, 마법사는 스태프만 등)
- 스킬 습득 테이블 — 레벨 → 스킬 매핑으로 레벨업 시 자동 습득
- 패시브 스킬 목록
이걸 Unit.cs의 jobData 필드에 연결하면, 레벨업 시 성장치와 스킬 습득이 jobData 기준으로 자동 처리됩니다.
// Unit.cs — LevelUp() 리팩토링
var growthData = jobData?.growthData ?? originData?.jobGrowthData;
var increases = stats.LevelUp(unitType, growthData);
// 레벨업 스킬 자동 습득
var newSkills = jobData.GetSkillsLearnedAtLevel(stats.level);
foreach (var skill in newSkills)
{
if (!skills.Contains(skill)) skills.Add(skill);
}
이제 에디터에서 JobData 에셋을 만들어 직업 15개를 정의하면, 코드 수정 없이 모든 유닛에 적용됩니다.
3. 👾 EnemyTemplateData + BossPhaseData 신설
적 유닛마다 일일이 UnitData를 만드는 건 비효율적입니다. 템플릿 기반으로 구조를 바꿨습니다.
EnemyTemplateData
- 레벨 범위(min~max) 지정 → 스폰 시 랜덤 레벨
- 스킬 풀에서 랜덤 배분 + 고정 스킬 보장
- 드롭 아이템 테이블 (확률 포함)
BossPhaseData를 연결하면 자동으로 보스 판정
BossPhaseData
보스 HP가 특정 구간에 진입하면 자동으로 페이즈 전환이 일어납니다.
트리거: HP 50% 이하 / 특정 턴 경과 / 아군 X명 사망
행동: AI 패턴 변경 / 새 스킬 추가 / 증원 소환 / 스탯 강화 / 외형 교체
파이널 판타지 택틱스의 보스전처럼, 전반부와 후반부 패턴이 확 달라지는 연출이 데이터만으로 설정 가능합니다.
4. 🗺️ ChapterData + GameDatabase 신설 — StageDatabase 은퇴
기존 StageDatabase는 스테이지를 평면 리스트로만 관리했습니다. 챕터 개념을 도입해 계층 구조로 바꿨습니다.
GameDatabase
├── ChapterData (Chapter 1: 모험의 시작)
│ ├── StageData (1-1)
│ ├── StageData (1-2)
│ └── StageData (1-3 보스)
└── ChapterData (Chapter 2: 왕도로의 여정)
└── ...
ChapterData는 챕터 해금 조건, 클리어 보상(골드/아이템), 챕터 썸네일까지 포함합니다.
StageDatabase는 [Obsolete] 마킹 후 메뉴 이름을 [Legacy]로 변경해서 새 프로젝트에서 실수로 사용하는 걸 방지했습니다.
5. ⚔️ StageData 확장 — 승리/패배 조건 + 증원 시스템
지금까지 모든 스테이지의 조건이 "적 전멸"이었는데, 이걸 다양화했습니다.
승리 조건 (VictoryConditionType)
| 조건 | 설명 |
|---|---|
| DefeatAllEnemies | 모든 적 처치 (기본) |
| DefeatBoss | 지정 보스만 처치 |
| ReachDestination | 특정 좌표 도달 |
| ProtectAlly | 아군 NPC 생존 |
| SurviveXTurns | X턴 동안 버티기 |
| CollectItem | 맵 아이템 수집 |
패배 조건 (DefeatConditionType)
| 조건 | 설명 |
|---|---|
| AllPlayersDead | 아군 전멸 (기본) |
| ProtectedAllyDead | 보호 대상 사망 |
| TurnLimitExceeded | 제한 턴 초과 |
| EnemyReachesGoal | 적이 목표 지점 도달 |
증원 웨이브 (ReinforcementWave)
특정 턴이 되거나, 보스 HP가 일정 이하로 떨어지면 새 적이 소환됩니다. announcement 문자열로 "적의 증원이 도착했다!" 같은 연출 메시지도 설정 가능합니다.
6. ⚗️ CraftRecipeData 신설 — 연금술사 조합 시스템
연금술사 직업을 위한 아이템 조합 레시피 ScriptableObject입니다.
// 조합 가능 여부 체크
recipe.CanCraft(inventory, unitLevel: 12, jobType: UnitType.Alchemist);
// 조합 시도 (RNG 반영)
bool success = recipe.TryRoll(out bool isCritical);
// 대성공 시 resultQuantity + 1 획득
주요 기능:
- 재료 목록 (아이템 + 수량)
- 기본 성공률 / 대성공 확률 / 실패 시 재료 반환 비율
- 직업 제한 (연금술사만 사용 가능 등)
- 골드 비용
📝 마치며
오늘 작업의 핵심은 "나중에 콘텐츠를 빠르게 채울 수 있는 데이터 구조" 를 만드는 것이었습니다.
직업 15개, 적 20종, 스테이지 30개... 지금은 텅 비어 있지만, 이제 에디터에서 ScriptableObject 에셋만 생성하면 코드 수정 없이 쭉쭉 채워갈 수 있습니다. 다음 단계는 이 데이터 구조를 실제 BattleManager에 연동해서 승리/패배 판정 로직을 구현하는 것입니다.
Written with Claude
🏷️ 추천 태그
#Unity #GameDev #IndieDev #SRPG #ScriptableObject #DataDriven #DevLog #Claude #AI_Coding #유니티 #개발로그 #인디게임 #전략RPG #직업시스템 #보스전
'AI > Unity' 카테고리의 다른 글
| 농장 경영 시뮬레이션 게임 만들기 - 1 (0) | 2026.04.19 |
|---|---|
| 타워디펜스 만들기 - Stage 운영 구조를 갈아엎고, 월드맵 UI와 선택 체감을 다듬기(Codex) (0) | 2026.03.08 |
| [Unity] 타워디펜스 맵 & 웨이브 에디터 (0) | 2026.03.02 |
| 타워 디펜스 만들기 - 맵 이미지 프롬프트 (1) | 2026.03.01 |
| Antigravity를 사용하여 타워 디펜스 게임 만들기 - 2 (전장 확장 및 스크롤 카메라 구현기) (0) | 2026.02.26 |