웨이브, 몬스터 데이터 스키마 변경

- waveMaster, monsterMaster 테이블 관련 파일 제거
- monster 테이블 추가
- 데이터 작업 가이드 txt 파일 추가
This commit is contained in:
BoyongHwang
2026-01-30 18:17:15 +09:00
parent 8c7c82e984
commit 1152093521
34 changed files with 98 additions and 265 deletions

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 25ab0c46cf6af334daf6817ed418e178
guid: feb45c3991f6f154a85c05158e784171
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -9,10 +9,10 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: eb34e2098ca7d654a81d495ad6e6f21b, type: 3}
m_Name: Data_Row1
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterMasterData
monsterId: 101
m_Script: {fileID: 11500000, guid: 71f75742bf2af604ba55221e30379f4a, type: 3}
m_Name: Monster101
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 101
memo: "Grunt(\uAE30\uBCF8)"
moveSpeed: 2.6
maxHp: 30
@@ -20,3 +20,5 @@ MonoBehaviour:
atkDamage: 3
atkIntervalSec: 1.2
prefabPath: Assets/Prefabs/EnemyTest
cost: 1
weight: 1

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 4566aa20a775cd04bac99329bb560b07
guid: cec2336a0be4b6c4eb954ac3d08aa8d9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000

View File

@@ -9,10 +9,10 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: eb34e2098ca7d654a81d495ad6e6f21b, type: 3}
m_Name: Data_Row2
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterMasterData
monsterId: 102
m_Script: {fileID: 11500000, guid: 71f75742bf2af604ba55221e30379f4a, type: 3}
m_Name: Monster102
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 102
memo: "Fast(\uBE60\uB984/\uC57D\uD568)"
moveSpeed: 3.4
maxHp: 18
@@ -20,3 +20,5 @@ MonoBehaviour:
atkDamage: 2
atkIntervalSec: 1
prefabPath: Assets/Prefabs/MonsterTest
cost: 2
weight: 0.5

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 0dc5ffa309a736b4a95faeb0ba9a9870
guid: fde07a19ade09f044aca9151f407d073
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000

View File

@@ -9,10 +9,10 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: eb34e2098ca7d654a81d495ad6e6f21b, type: 3}
m_Name: Data_Row3
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterMasterData
monsterId: 103
m_Script: {fileID: 11500000, guid: 71f75742bf2af604ba55221e30379f4a, type: 3}
m_Name: Monster103
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 103
memo: "Tank(\uB290\uB9BC/\uB2E8\uB2E8)"
moveSpeed: 2
maxHp: 70
@@ -20,3 +20,5 @@ MonoBehaviour:
atkDamage: 4
atkIntervalSec: 1.5
prefabPath: Assets/Prefabs/Core
cost: 5
weight: 0.2

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a7b8bd34df6e81441afcbac36c0a1340
guid: 5687251677f89394fbdc083ff34e06d0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000

View File

@@ -9,10 +9,10 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: eb34e2098ca7d654a81d495ad6e6f21b, type: 3}
m_Name: Data_Row4
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterMasterData
monsterId: 104
m_Script: {fileID: 11500000, guid: 71f75742bf2af604ba55221e30379f4a, type: 3}
m_Name: Monster104
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 104
memo: "Ranged(\uC6D0\uAC70\uB9AC/\uC57D\uD568)"
moveSpeed: 2.4
maxHp: 22
@@ -20,3 +20,5 @@ MonoBehaviour:
atkDamage: 2
atkIntervalSec: 1.4
prefabPath: Assets/Prefabs/Resource
cost: 3
weight: 0.333

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: e003d9bc04014834b8d4e6bead723568
guid: 3663ac7b7b070cb4bad5f4d05e73899d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000

View File

@@ -9,10 +9,10 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: eb34e2098ca7d654a81d495ad6e6f21b, type: 3}
m_Name: Data_Row5
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterMasterData
monsterId: 105
m_Script: {fileID: 11500000, guid: 71f75742bf2af604ba55221e30379f4a, type: 3}
m_Name: Monster105
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 105
memo: "Elite(\uC18C\uC218 \uC815\uC608)"
moveSpeed: 2.8
maxHp: 120
@@ -20,3 +20,5 @@ MonoBehaviour:
atkDamage: 7
atkIntervalSec: 1.3
prefabPath: Assets/Prefabs/ResourcePickup
cost: 10
weight: 0.1

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 329fdb6e92ee4064bb41ca8e0fa4c86c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 5b634a7c580ad824381bcbcaaa1d7047
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 47db706e7f90d914f8b05b88b626b406
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0f6af2548b6a6049b54c1d50e7a6c53, type: 3}
m_Name: Data_Row1
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.WaveMasterData
waveId: 1
waveKey: WAVE_001
memo:
durationSec: 90
monsterIdList: 101
monsterCountList: 10

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 916cc5c2dde7f79408a2ec3a8830f1f6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0f6af2548b6a6049b54c1d50e7a6c53, type: 3}
m_Name: Data_Row2
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.WaveMasterData
waveId: 2
waveKey: WAVE_002
memo:
durationSec: 90
monsterIdList: 102
monsterCountList: 20

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 0d5315e12bb9dc440ae593ab703891d6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0f6af2548b6a6049b54c1d50e7a6c53, type: 3}
m_Name: Data_Row3
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.WaveMasterData
waveId: 3
waveKey: WAVE_003
memo:
durationSec: 90
monsterIdList: 103
monsterCountList: 5

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 97dc48f8cf531c847942d3eef6dc615c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0f6af2548b6a6049b54c1d50e7a6c53, type: 3}
m_Name: Data_Row4
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.WaveMasterData
waveId: 4
waveKey: WAVE_004
memo:
durationSec: 90
monsterIdList: 104
monsterCountList: 3

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: f555b6db60f636d40b24efeb999fd200
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0f6af2548b6a6049b54c1d50e7a6c53, type: 3}
m_Name: Data_Row5
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.WaveMasterData
waveId: 5
waveKey: WAVE_005
memo:
durationSec: 90
monsterIdList: 105
monsterCountList: 2

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 820652adf90840e45a832fd8985615b9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -2,15 +2,16 @@
// 생성 스크립트: DataTools/generate_csharp_classes.py
using UnityEngine;
using System.Collections.Generic; // 리스트 지원을 위해 추가
namespace Northbound.Data
{
[CreateAssetMenu(fileName = "MonsterMasterData", menuName = "DigAndDefend/MonsterMaster Data")]
public class MonsterMasterData : ScriptableObject
[CreateAssetMenu(fileName = "MonsterData", menuName = "DigAndDefend/Monster Data")]
public class MonsterData : ScriptableObject
{
[Header("기본 정보")]
/// <summary>몬스터 고유 ID</summary>
public int monsterId;
public int id;
/// <summary>메모</summary>
public string memo;
/// <summary>이동속도</summary>
@@ -25,6 +26,10 @@ namespace Northbound.Data
public float atkIntervalSec;
/// <summary>프리팹/리소스 경로</summary>
public string prefabPath;
/// <summary>몬스터 난이도 점수</summary>
public int cost;
/// <summary>등장 가중치</summary>
public float weight;
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 71f75742bf2af604ba55221e30379f4a

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: eb34e2098ca7d654a81d495ad6e6f21b

View File

@@ -1,26 +0,0 @@
// 이 파일은 자동 생성되었습니다. 직접 수정하지 마세요!
// 생성 스크립트: DataTools/generate_csharp_classes.py
using UnityEngine;
namespace Northbound.Data
{
[CreateAssetMenu(fileName = "WaveMasterData", menuName = "DigAndDefend/WaveMaster Data")]
public class WaveMasterData : ScriptableObject
{
[Header("기본 정보")]
/// <summary>웨이브 고유 ID</summary>
public int waveId;
/// <summary>사람이 읽는 고정 키 (예: WAVE_001)</summary>
public string waveKey;
/// <summary>기획/개발 메모(비출력)</summary>
public string memo;
/// <summary>웨이브 주기(초). 기본 90</summary>
public int durationSec;
/// <summary>해당 웨이브에서 소환할 몬스터 ID 목록</summary>
public string monsterIdList;
/// <summary>해당 웨이브에서 소환할 몬스터 ID 별 소환 개수</summary>
public string monsterCountList;
}
}

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: b0f6af2548b6a6049b54c1d50e7a6c53

View File

@@ -1,6 +1,6 @@
[
{
"name": "monster_id",
"name": "id",
"type": "int",
"condition": null,
"description": "몬스터 고유 ID"
@@ -46,5 +46,17 @@
"type": "string",
"condition": null,
"description": "프리팹/리소스 경로"
},
{
"name": "cost",
"type": "int",
"condition": null,
"description": "몬스터 난이도 점수"
},
{
"name": "weight",
"type": "float",
"condition": null,
"description": "등장 가중치"
}
]

View File

@@ -1,38 +0,0 @@
[
{
"name": "wave_id",
"type": "int",
"condition": null,
"description": "웨이브 고유 ID"
},
{
"name": "wave_key",
"type": "string",
"condition": null,
"description": "사람이 읽는 고정 키 (예: WAVE_001)"
},
{
"name": "memo",
"type": "string",
"condition": null,
"description": "기획/개발 메모(비출력)"
},
{
"name": "duration_sec",
"type": "int",
"condition": null,
"description": "웨이브 주기(초). 기본 90"
},
{
"name": "monster_id_list",
"type": "string",
"condition": null,
"description": "해당 웨이브에서 소환할 몬스터 ID 목록"
},
{
"name": "monster_count_list",
"type": "string",
"condition": null,
"description": "해당 웨이브에서 소환할 몬스터 ID 별 소환 개수"
}
]

6
GameData/Monster.csv Normal file
View File

@@ -0,0 +1,6 @@
id,memo,move_speed,max_hp,atk_range,atk_damage,atk_interval_sec,prefab_path,cost,weight
101,Grunt(기본),2.6,30,1,3,1.2,Assets/Prefabs/EnemyTest,1,1
102,Fast(빠름/약함),3.4,18,1,2,1,Assets/Prefabs/MonsterTest,2,0.5
103,Tank(느림/단단),2,70,1,4,1.5,Assets/Prefabs/Core,5,0.2
104,Ranged(원거리/약함),2.4,22,5,2,1.4,Assets/Prefabs/Resource,3,0.333
105,Elite(소수 정예),2.8,120,1,7,1.3,Assets/Prefabs/ResourcePickup,10,0.1
1 id memo move_speed max_hp atk_range atk_damage atk_interval_sec prefab_path cost weight
2 101 Grunt(기본) 2.6 30 1 3 1.2 Assets/Prefabs/EnemyTest 1 1
3 102 Fast(빠름/약함) 3.4 18 1 2 1 Assets/Prefabs/MonsterTest 2 0.5
4 103 Tank(느림/단단) 2 70 1 4 1.5 Assets/Prefabs/Core 5 0.2
5 104 Ranged(원거리/약함) 2.4 22 5 2 1.4 Assets/Prefabs/Resource 3 0.333
6 105 Elite(소수 정예) 2.8 120 1 7 1.3 Assets/Prefabs/ResourcePickup 10 0.1

View File

@@ -1,6 +0,0 @@
monster_id,memo,move_speed,max_hp,atk_range,atk_damage,atk_interval_sec,prefab_path
101,Grunt(기본),2.6,30,1,3,1.2,Assets/Prefabs/EnemyTest
102,Fast(빠름/약함),3.4,18,1,2,1,Assets/Prefabs/MonsterTest
103,Tank(느림/단단),2,70,1,4,1.5,Assets/Prefabs/Core
104,Ranged(원거리/약함),2.4,22,5,2,1.4,Assets/Prefabs/Resource
105,Elite(소수 정예),2.8,120,1,7,1.3,Assets/Prefabs/ResourcePickup
1 monster_id memo move_speed max_hp atk_range atk_damage atk_interval_sec prefab_path
2 101 Grunt(기본) 2.6 30 1 3 1.2 Assets/Prefabs/EnemyTest
3 102 Fast(빠름/약함) 3.4 18 1 2 1 Assets/Prefabs/MonsterTest
4 103 Tank(느림/단단) 2 70 1 4 1.5 Assets/Prefabs/Core
5 104 Ranged(원거리/약함) 2.4 22 5 2 1.4 Assets/Prefabs/Resource
6 105 Elite(소수 정예) 2.8 120 1 7 1.3 Assets/Prefabs/ResourcePickup

View File

@@ -1,6 +0,0 @@
wave_id,wave_key,memo,duration_sec,monster_id_list,monster_count_list
1,WAVE_001,,90,101,10
2,WAVE_002,,90,102,20
3,WAVE_003,,90,103,5
4,WAVE_004,,90,104,3
5,WAVE_005,,90,105,2
1 wave_id wave_key memo duration_sec monster_id_list monster_count_list
2 1 WAVE_001 90 101 10
3 2 WAVE_002 90 102 20
4 3 WAVE_003 90 103 5
5 4 WAVE_004 90 104 3
6 5 WAVE_005 90 105 2

View File

@@ -0,0 +1,26 @@
Step 1: 프로그램 실행
프로젝트 폴더에서 PowerShell 실행 후
.\sync-from-notion.ps1
Step 2: 스키마 선택
동기화할 스키마:
1. Towers
2. Enemies
3. 전체
선택: 1
Step 3: 결과 확인
📋 Towers 동기화
✅ 11개 필드 로드
💾 백업: Towers_20260122_143022.xlsx
✅ 저장 완료: GameData\Towers.xlsx
Step 4: Excel등에서 csv파일의 데이터 입력/수정
Step 5: Unity 에디터 상단의 Northbound 탭 => Data Importer 메뉴 실행
Step 6: Unity ScriptableObject(프리팹, 애셋) 생성 (자동)
Step 7: 수정한 csv 파일과 생성된 SO 파일을 모두 commit & push