DevLog/유니티 프로젝트

[HDProject]QuestSystem 초안 구상

뽀또치즈맛 2025. 5. 24. 03:20

 
확장 가능성을 열어둔 퀘스트 시스템을 제작하는 것이 목표이다.
 

  • ScriptableObject 기반 구조
  • 조건 / 보상 모듈화
  • 이벤트 기반 처리
  • UI 연동
  • 저장 / 로드 기능
  • 퀘스트 트리 기능 (연계 퀘스트)
  • 보상 타입 다양화 (경험치, 아이템, 등등)
  • 구글 시트 연동 클래스 사용
  • 시나리오 정렬 검색
  • 샘플 씬에서 퀘스트 잘 돌아가는지 확인하기
  • 퀘스트 UI 제작
  • 보상 Grant 시 인벤토리, 경험치 시스템 연동
  • Addressables 기반 리소스 매핑 자동화
  • UI에서 보상 미리보기 지원
  • 퀘스트 완료 시 팝업 애니메이션 연출

전반적인 구조
QuestSystem
├── Core
├── Runtime
├── Editor
├── UI
├── Data
└── Sheets
 
 

DT 퀘스트 별 분할 기준

 
DT 구상하기 퀘스트 타입 연계
UIAssetInfo->PlayerSystem.FolderPath =>  1) 연계 퀘스트 - 메인 
UIAssetInfo->PlayerSystem.FolderPath =>  2) 연계 퀘스트 - 서브 
UIAssetInfo->PlayerSystem.FolderPath =>  3) 연계 퀘스트 - 데일리
 
DT 구상 퀘스트 비연계
UIAssetInfo->PlayerSystem.FolderPath =>  1) 비연계 퀘스트 - 메인 
UIAssetInfo->PlayerSystem.FolderPath =>  2) 비연계 퀘스트 - 서브
UIAssetInfo->PlayerSystem.FolderPath =>  3) 비연계 퀘스트 - 데일리
 
비연계 퀘스트 분할 폴더
대륙별 분할 - 맵별 분할
 
연계 퀘스트 분할 폴더
스토리 이름 분할 - 순서대로 인덱스 부여
 

[System.Serializable]
public class QuestMetaDTO
{
    public string questId;
    public QuestType questType;           	// Main, Sub, Daily
    public bool isLinkedToStory;          	// 연계 퀘스트 여부
    public string StoryQuestID;             // 연계 시: 스토리 ID (비연계 시 null)
    public int storyIndex;                	// 연계 시: 순서 인덱스 (0부터)
    public string region;                 	// 비연계 시: 대륙명
    public string mapName;               	// 비연계 시: 맵 이름
}

 
 
QuestID -> QuestMetaDT 접근 가능 
QuestMetaDT -> Reward, Condition 접근 가능
 
스토리는 관련 변수 QuestMetaDTO 에 다 있음.
비스토리는 QuestMetaDTO
region과 mapName으로 현재 맵 및 대륙 체크 후 퀘스트 안정성 확보
NPC별로 가질 수 있는 QuestID 부여
 

DT 퀘스트 구성 기준

-> 하위 시트
. 내부 포함 목록
=> 외부 시트
- 내부 구성 목록
 
QuestMetaDTO DT
- 퀘스트 고유 ID
- QuestType
- 연계 퀘스트 여부
- 연계 퀘스트일 경우 연결된 스토리 ID
- 연계 쿼스트 스토리 내 순서
- 비연계 쿼스트 대륙명
- 비연계 쿼스트 맵 이름 
 
DT 예시 추가 수정 가능성 있음 (메타 아이디 생략)

IDX  questId  questType  isLinkedToStory  StoryQuestID  storyIndex  region  mapName
1 Q001 Main TRUE SQ001 0    
2 Q002 Sub TRUE SQ002 1    
3 Q003 Daily FALSE   -1 ContinentA Map01
4 Q004 Main TRUE SQ021 0    
5 Q005 Sub FALSE   -1 ContinentB Map02

 
QuestReward DT
 
QuestReward
- Grade SSS Ratio
(SSS~F까지 골드일 때, 경험치일 때, Item일 때
캐릭터 캐쉬로만 구입한 티켓 횟수에 따른 드랍 확률 조정 기준)
 

idx RewardID  RewardType  Grade  Ratio  Notes
1 R001 Gold SSS 0.05 캐릭터 캐쉬 티켓 횟수 따른 조정
2 R002 Exp A 0.10  
3 R003 Item B 0.15  

 
QuestReward->Gold
- GoldAmount
- Grade (SSS~F)
- 퀘스트 난이도 별
 
QuestReward->Exp
- ExpAmount
- Grade (SSS~F)
- 퀘스트 난이도 별
 
QuestReward->Item
- GoldAmount
- Grade (SSS~F)
- 퀘스트 난이도 별
 
QuestCondition DT
 

IDX ConditionID  ConditionType  Param1  Param2  Description
1 C001 MinPlayerLevel 10   플레이어 최소 레벨 10 이상 필요
2 C002 CompletedQuest Q001   선행 퀘스트 Q001 완료 필요
3 C003 ItemRequirement Item001 5 아이템 Item001 5개 이상 필요
4 C004 TimeOfDay Night   야간에만 수행 가능

 
 
QuestStroy DT

IDX StoryID  ConditionID QuestStoryName  QuestStoryMemo
1 Story001 C001 The Awakening 주인공이 힘을 깨닫는 메인 스토리
2 Story002 C003 The War Begins 전쟁의 서막, 적과 맞서 싸우는 이야기

 
 
StoryQuest DT

IDX StoryQuestID  StoryID  QuestID  QuestOrder  QuestType  AdditionalNotes
1 SQ001 Story001 Q001 1 Main 스토리 시작 메인 퀘스트
2 SQ002 Story001 Q002 2 Main 메인 퀘스트 2단계
3 SQ003 Story001 Q003 3 Sub 서브 퀘스트 1단계
4 SQ004 Story001 Q004 4 Daily 데일리 퀘스트 1단계
5 SQ005 Story001 Q005 5 Daily 데일리 퀘스트 2단계

 
 
StoryQuestMetaDifficulty DT

IDX QuestMetaID  QuestID  Difficulty  StoryQuestID  StoryIndex  ConditionID  RewardID  Notes
1 M001 Q001 Easy SQ001 0 C001 R001 메인 퀘스트 쉬움 난이도
2 M002 Q001 Normal SQ001 0 C002 R002 메인 퀘스트 보통 난이도
3 M003 Q001 Hard SQ001 0 C003 R003 메인 퀘스트 어려움 난이도
4 M004 Q002 Normal SQ002 1 C004 R004 서브 퀘스트 보통 난이도

 
 
QuestMeta DT

IDX MappingID  QuestName StoryQuestID  QuestID Notes
1 M001 AStory01 SQ001 Q001 메인 퀘스트 쉬움 난이도
2 M002 Bstroy02 SQ001 Q001 메인 퀘스트 보통 난이도
3 M003 AStory03 SQ001 Q001 메인 퀘스트 어려움 난이도
4 M004 BStory04 SQ002 Q002 서브 퀘스트 보통 난이도

 
 
 
NonLinkedQuestMetaDifficulty DT
IDX 

IDX QuestMetaID  QuestID  Difficulty  ConditionID  RewardID  Notes
1 NM001 Q008 Easy C101 R101 비연계 메인 퀘스트 쉬움
2 NM002 Q008 Normal C102 R102 비연계 메인 퀘스트 보통
3 NM003 Q009 Hard C103 R103 비연계 메인 퀘스트 어려움
4 NM004 Q009 Normal C104 R104 비연계 서브 퀘스트 보통

 
 
QuestMeta DT

IDX MappingID  QuestName StoryQuestID  QuestID  Notes
1 NM001 AProject   Q008 메인 퀘스트 쉬움 난이도
2 NM002 BProject   Q008 메인 퀘스트 보통 난이도
3 NM003 CProject   Q009 메인 퀘스트 어려움 난이도
4 NM004 GoobProject   Q009 서브 퀘스트 보통 난이도

 
 
NPCQuestList DT
 

IDX  NPCID  QuestIDList
1 NPC001 Q001,Q002,Q005
2 NPC002 Q003,Q004
3 NPC003 Q002,Q006,Q007,Q008

 
 
JSON 형식 예시

[
  {
    "IDX": 1,
    "NPCID": "NPC001",
    "QuestIDList": ["Q001", "Q002", "Q005"]
  },
  {
    "IDX": 2,
    "NPCID": "NPC002",
    "QuestIDList": ["Q003", "Q004"]
  },
  {
    "IDX": 3,
    "NPCID": "NPC003",
    "QuestIDList": ["Q002", "Q006", "Q007", "Q008"]
  }
]



전투 시스템 구현 골격 작성한 뒤 다시 퀘스트로 돌아오기
1. HP MP 등 기본 UI 제작
2. 스킬 시스템 제작 서버 클라 분할하기
3. 마을 맵 던전 맵 구분하기
포탈 오브젝트 구현
- 맵 전환 및 조건 판정 등

Assets/MapSystemToolkit/
├── Data/
│   └── MapInfo.cs
├── Runtime/
│   ├── MapManager.cs
│   ├── MapType.cs
│   ├── MapPortal.cs
│   └── MonsterSpawner.cs
├── Editor/
│   └── MapInfoGenerator.cs
├── Scenes/
│   ├── TownScene.unity
│   ├── FieldScene.unity
│   └── DungeonScene.unity
└── Resources/
    └── MapData/
        └── Town, Field1, Dungeon001.asset

Assets/SkillSystemToolkit/
├── Data/
│   ├── SkillData.cs
│   └── Resources/
│       └── SkillData/*.asset
├── Editor/
│   └── SkillDataGenerator.cs
├── Runtime/
│   ├── SkillHandler.cs
│   ├── SkillInventory.cs
│   ├── SkillSaveManager.cs
│   ├── Monster.cs
│   ├── BossAI.cs
│   └── EffectSpawner.cs
├── UI/
│   ├── SkillSlotUI.cs
│   └── SkillUIManager.cs
├── Sheets/
│   └── skills_sheet.json
└── Prefabs/
    └── Effects/
        └── FireballEffect, WhirlwindEffect, SmashEffect