AI/Unity

🛠️ Unity SRPG 개발 로그: 데이터 구조 대확장 — 직업, 보스, 챕터, 조합 시스템

blacknabis 2026. 4. 5. 03:53
반응형

오늘은 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.csjobData 필드에 연결하면, 레벨업 시 성장치와 스킬 습득이 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 #직업시스템 #보스전

반응형