확장 가능성을 열어둔 퀘스트 시스템을 제작하는 것이 목표이다.
- 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
'DevLog > 유니티 프로젝트' 카테고리의 다른 글
DT 기능 에디터 만들기 GoogleSheetURLParser Class 설명 (2) | 2025.06.08 |
---|---|
구글 엑셀 연동 DT 관리 - GoogleDTTemplate 클래스 정리 (1) | 2025.05.27 |
[HDProject] NPC AI LLM dialogue System 서버 연동 및 UI 구현 中 (0) | 2025.05.13 |
TMPTextStyle.ApplyTo 참고자료 업로드 + DataStorage Tool 구상안 (0) | 2025.05.13 |
[HDProject] NPC AI dialogue System 추가 & 진행 상황 (0) | 2025.05.13 |