diff --git a/Assets/Data/ScriptableObjects/Tower.meta b/Assets/Data/ScriptableObjects/Tower.meta
new file mode 100644
index 0000000..a7b04c2
--- /dev/null
+++ b/Assets/Data/ScriptableObjects/Tower.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2164a3a8d18dfc44caedbd4ca5bd9eb6
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Data/ScriptableObjects/Tower/Tower001.asset b/Assets/Data/ScriptableObjects/Tower/Tower001.asset
new file mode 100644
index 0000000..9a57d8f
--- /dev/null
+++ b/Assets/Data/ScriptableObjects/Tower/Tower001.asset
@@ -0,0 +1,25 @@
+%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: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
+ m_Name: Tower001
+ m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
+ id: 1
+ memo: "\uD0C0\uC6CC"
+ mana: 25
+ manpower: 10
+ sizeX: 3
+ sizeY: 3
+ maxHp: 50
+ atkRange: 10
+ atkDamage: 5
+ atkIntervalSec: 2
+ prefabPath: Assets/Prefabs/TowerArrow
diff --git a/Assets/Data/ScriptableObjects/Tower/Tower001.asset.meta b/Assets/Data/ScriptableObjects/Tower/Tower001.asset.meta
new file mode 100644
index 0000000..27b4814
--- /dev/null
+++ b/Assets/Data/ScriptableObjects/Tower/Tower001.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d75326370af2a2840958aae74db56dee
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Data/ScriptableObjects/Tower/Tower002.asset b/Assets/Data/ScriptableObjects/Tower/Tower002.asset
new file mode 100644
index 0000000..43a884b
--- /dev/null
+++ b/Assets/Data/ScriptableObjects/Tower/Tower002.asset
@@ -0,0 +1,25 @@
+%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: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
+ m_Name: Tower002
+ m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
+ id: 2
+ memo: "\uBCBD"
+ mana: 5
+ manpower: 5
+ sizeX: 1
+ sizeY: 1
+ maxHp: 30
+ atkRange: 0
+ atkDamage: 0
+ atkIntervalSec: 0
+ prefabPath: Assets/Prefabs/Wall
diff --git a/Assets/Data/ScriptableObjects/Tower/Tower002.asset.meta b/Assets/Data/ScriptableObjects/Tower/Tower002.asset.meta
new file mode 100644
index 0000000..66d4fdb
--- /dev/null
+++ b/Assets/Data/ScriptableObjects/Tower/Tower002.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: df145fdd58f30464eb4eb02cfbfb280d
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Data/Scripts/DataClasses/TowerData.cs b/Assets/Data/Scripts/DataClasses/TowerData.cs
new file mode 100644
index 0000000..59b9751
--- /dev/null
+++ b/Assets/Data/Scripts/DataClasses/TowerData.cs
@@ -0,0 +1,37 @@
+// 이 파일은 자동 생성되었습니다. 직접 수정하지 마세요!
+// 생성 스크립트: DataTools/generate_csharp_classes.py
+
+using UnityEngine;
+using System.Collections.Generic; // 리스트 지원을 위해 추가
+
+namespace Northbound.Data
+{
+ [CreateAssetMenu(fileName = "TowerData", menuName = "Northbound/Tower Data")]
+ public class TowerData : ScriptableObject
+ {
+ [Header("기본 정보")]
+ /// 고유 ID
+ public int id;
+ /// 기획 메모
+ public string memo;
+ /// 건설 비용 (mana=20) (mana=50; iron=10)
+ public int mana;
+ /// 건설 노동량
+ public float manpower;
+ /// X 그리드 차지 공간
+ public int sizeX;
+ /// Y 그리드 차지 공간
+ public int sizeY;
+ /// 체력
+ public int maxHp;
+ /// 사정거리
+ public int atkRange;
+ /// 데미지
+ public int atkDamage;
+ /// 공격 주기
+ public float atkIntervalSec;
+ /// 프리팹/리소스 경로
+ public string prefabPath;
+
+ }
+}
\ No newline at end of file
diff --git a/Assets/Data/Scripts/DataClasses/TowerData.cs.meta b/Assets/Data/Scripts/DataClasses/TowerData.cs.meta
new file mode 100644
index 0000000..1bc111b
--- /dev/null
+++ b/Assets/Data/Scripts/DataClasses/TowerData.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 8c40fef5ebc37b743a3f225c1ca57c32
\ No newline at end of file
diff --git a/GameData/.Tower_schema.json b/GameData/.Tower_schema.json
new file mode 100644
index 0000000..bd677e4
--- /dev/null
+++ b/GameData/.Tower_schema.json
@@ -0,0 +1,68 @@
+[
+ {
+ "name": "id",
+ "type": "int",
+ "condition": null,
+ "description": "고유 ID"
+ },
+ {
+ "name": "memo",
+ "type": "string",
+ "condition": null,
+ "description": "기획 메모"
+ },
+ {
+ "name": "mana",
+ "type": "int",
+ "condition": null,
+ "description": "건설 비용\\n(mana=20)\\n(mana=50; iron=10)"
+ },
+ {
+ "name": "manpower",
+ "type": "float",
+ "condition": null,
+ "description": "건설 노동량"
+ },
+ {
+ "name": "size_x",
+ "type": "int",
+ "condition": null,
+ "description": "X 그리드 차지 공간"
+ },
+ {
+ "name": "size_y",
+ "type": "int",
+ "condition": null,
+ "description": "Y 그리드 차지 공간"
+ },
+ {
+ "name": "max_hp",
+ "type": "int",
+ "condition": null,
+ "description": "체력"
+ },
+ {
+ "name": "atk_range",
+ "type": "int",
+ "condition": null,
+ "description": "사정거리"
+ },
+ {
+ "name": "atk_damage",
+ "type": "int",
+ "condition": null,
+ "description": "데미지"
+ },
+ {
+ "name": "atk_interval_sec",
+ "type": "float",
+ "condition": null,
+ "description": "공격 주기"
+ },
+ {
+ "name": "prefab_path",
+ "type": "string",
+ "condition": null,
+ "description": "프리팹/리소스 경로"
+ }
+]
\ No newline at end of file
diff --git a/GameData/Tower.csv b/GameData/Tower.csv
new file mode 100644
index 0000000..ffbde1e
--- /dev/null
+++ b/GameData/Tower.csv
@@ -0,0 +1,3 @@
+id,memo,mana,manpower,size_x,size_y,max_hp,atk_range,atk_damage,atk_interval_sec,prefab_path
+1,타워,25,10,3,3,50,10,5,2,Assets/Prefabs/TowerArrow
+2,벽,5,5,1,1,30,0,0,0,Assets/Prefabs/Wall