구글 시트 수정 중

This commit is contained in:
NTG_Lenovo 2025-05-13 16:49:50 +09:00
parent ce4c1d27bf
commit 6c9283ed6e
40 changed files with 1205 additions and 82 deletions

View File

@ -15,13 +15,13 @@ MonoBehaviour:
m_GroupName: GoogleSheetSo_Group
m_GUID: 7fe0c33d351391a45a0ea3c93ecef42e
m_SerializeEntries:
- m_GUID: 2a1b86f3356293441bcfca705fff3b85
- m_GUID: 1542a7a4161005c4baf6262cdf5f4ac7
m_Address: MonsterSo
m_ReadOnly: 0
m_SerializedLabels:
- GoogleSheetSo
FlaggedDuringContentUpdateRestriction: 0
- m_GUID: 8f6a170dcd0a88d47939e70db303af14
- m_GUID: ccb6f7909b5ffd94499bbeaef45086be
m_Address: FoodSo
m_ReadOnly: 0
m_SerializedLabels:

View File

@ -290,7 +290,7 @@ MonoBehaviour:
_googleSheetUrl: https://script.google.com/macros/s/AKfycbw8TRSl_OuY2S-RX0yvOJi1SqNqoflG0R3pWxk9GC9u_wvGQeuABZc0VH7YJ5lMrAl4/exec
_availSheets: Food/Monster
_generateFolderPath: /_Datas/02.Scripts/GenerateGoogleSheet/AutoCreated
_currentVersion: "0 - 2025-05-13 15:02:17 by \uB0A8\uD0DC\uAC74"
_currentVersion: "7 - 2025-05-13 16:44:24 by \uB0A8\uD0DC\uAC74"
_restoreIndex: 0
_editorName:
_refreshTrigger: 1

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: fb4a8c3ebcd8b9040b65650bcb10ed6c
guid: 68c35d02b1414b34f87d8c3169f743e5
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: eca79fbd6ba923849bafc170520d87c1
guid: 46bf69576c1d1b24ebce48222bcb0a4d
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 1cf6b1e28051e1f418882d448a258c13
guid: 07e7795754f7da943976cb3e16c363d8
TextScriptImporter:
externalObjects: {}
userData:

View File

@ -0,0 +1,81 @@
{
"$개요": [
{
"": "시트 생성"
}
],
"Food": [
{
"Id:string": "식별ID",
"Name:string": "이름",
"Ingredient1:string": "재료1",
"Ingredient2:string": "재료2",
"Taste1:Taste_Enum": "맛1",
"Taste2:Taste_Enum": "맛2",
"Sprite:Sprite": "Addressable 이미지 이름"
},
{
"Id:string": "Food001",
"Name:string": "햇빛수프",
"Ingredient1:string": "극락쌀",
"Ingredient2:string": "햇빛당근",
"Taste1:Taste_Enum": "Bitter",
"Taste2:Taste_Enum": "Sweet",
"Sprite:Sprite": "Gold"
},
{
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 11,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
},
{
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 22,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
},
{
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 33,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""
}
],
"Monster": [
{
"Id": "식별번호",
"Name": "이름",
"T1": "테스트1"
},
{
"Id": "Test001",
"Name": "A",
"T1": 1
},
{
"Id": "Test002",
"Name": "B",
"T1": 2
},
{
"Id": "Test003",
"Name": "C",
"T1": 3
},
{
"Id": "Test004",
"Name": "D",
"T1": 4
}
]
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 2f85d1030505c1a46b9c4b296dfd1213
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,81 @@
{
"$개요": [
{
"": "시트 생성"
}
],
"Food": [
{
"Id:string": "식별ID",
"Name:string": "이름",
"Ingredient1:string": "재료1",
"Ingredient2:string": "재료2",
"Taste1:Taste_Enum": "맛1",
"Taste2:Taste_Enum": "맛2",
"Sprite:Sprite": "Addressable 이미지 이름"
},
{
"Id:string": "Food001",
"Name:string": "햇빛수프",
"Ingredient1:string": "극락쌀",
"Ingredient2:string": "햇빛당근",
"Taste1:Taste_Enum": "Bitter",
"Taste2:Taste_Enum": "Sweet",
"Sprite:Sprite": "Gold"
},
{
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 7,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
},
{
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 7,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
},
{
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 7,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""
}
],
"Monster": [
{
"Id": "식별번호",
"Name": "이름",
"T1": "테스트1"
},
{
"Id": "Test001",
"Name": "A",
"T1": 1
},
{
"Id": "Test002",
"Name": "B",
"T1": 2
},
{
"Id": "Test003",
"Name": "C",
"T1": 3
},
{
"Id": "Test004",
"Name": "D",
"T1": 4
}
]
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: f7e7c66cf0ba20d4f9f69ec1de7247c7
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,81 @@
{
"$개요": [
{
"": "시트 생성"
}
],
"Food": [
{
"Id:string": "식별ID",
"Name:string": "이름",
"Ingredient1:string": "재료1",
"Ingredient2:string": "재료2",
"Taste1:Taste_Enum": "맛1",
"Taste2:Taste_Enum": "맛2",
"Sprite:Sprite": "Addressable 이미지 이름"
},
{
"Id:string": "Food001",
"Name:string": "햇빛수프",
"Ingredient1:string": "극락쌀",
"Ingredient2:string": "햇빛당근",
"Taste1:Taste_Enum": "Bitter",
"Taste2:Taste_Enum": "Sweet",
"Sprite:Sprite": "Gold"
},
{
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 8,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
},
{
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 8,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
},
{
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 8,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""
}
],
"Monster": [
{
"Id": "식별번호",
"Name": "이름",
"T1": "테스트1"
},
{
"Id": "Test001",
"Name": "A",
"T1": 1
},
{
"Id": "Test002",
"Name": "B",
"T1": 2
},
{
"Id": "Test003",
"Name": "C",
"T1": 3
},
{
"Id": "Test004",
"Name": "D",
"T1": 4
}
]
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: fd833067e5a7f804baef09baccca5d35
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,81 @@
{
"$개요": [
{
"": "시트 생성"
}
],
"Food": [
{
"Id:string": "식별ID",
"Name:string": "이름",
"Ingredient1:string": "재료1",
"Ingredient2:string": "재료2",
"Taste1:Taste_Enum": "맛1",
"Taste2:Taste_Enum": "맛2",
"Sprite:Sprite": "Addressable 이미지 이름"
},
{
"Id:string": "Food001",
"Name:string": "햇빛수프",
"Ingredient1:string": "극락쌀",
"Ingredient2:string": "햇빛당근",
"Taste1:Taste_Enum": "Bitter",
"Taste2:Taste_Enum": "Sweet",
"Sprite:Sprite": "Gold"
},
{
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 9,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
},
{
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 9,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
},
{
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 9,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""
}
],
"Monster": [
{
"Id": "식별번호",
"Name": "이름",
"T1": "테스트1"
},
{
"Id": "Test001",
"Name": "A",
"T1": 1
},
{
"Id": "Test002",
"Name": "B",
"T1": 2
},
{
"Id": "Test003",
"Name": "C",
"T1": 3
},
{
"Id": "Test004",
"Name": "D",
"T1": 4
}
]
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9fabf60774f9a7941b5c170871ca941c
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,81 @@
{
"$개요": [
{
"": "시트 생성"
}
],
"Food": [
{
"Id:string": "식별ID",
"Name:string": "이름",
"Ingredient1:string": "재료1",
"Ingredient2:string": "재료2",
"Taste1:Taste_Enum": "맛1",
"Taste2:Taste_Enum": "맛2",
"Sprite:Sprite": "Addressable 이미지 이름"
},
{
"Id:string": "Food001",
"Name:string": "햇빛수프",
"Ingredient1:string": "극락쌀",
"Ingredient2:string": "햇빛당근",
"Taste1:Taste_Enum": "Bitter",
"Taste2:Taste_Enum": "Sweet",
"Sprite:Sprite": "Gold"
},
{
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 333,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
},
{
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 444,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
},
{
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 555,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""
}
],
"Monster": [
{
"Id": "식별번호",
"Name": "이름",
"T1": "테스트1"
},
{
"Id": "Test001",
"Name": "A",
"T1": 1
},
{
"Id": "Test002",
"Name": "B",
"T1": 2
},
{
"Id": "Test003",
"Name": "C",
"T1": 3
},
{
"Id": "Test004",
"Name": "D",
"T1": 4
}
]
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 2252c8d797af75e49adb65a24069c094
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,81 @@
{
"$개요": [
{
"": "시트 생성"
}
],
"Food": [
{
"Id:string": "식별ID",
"Name:string": "이름",
"Ingredient1:string": "재료1",
"Ingredient2:string": "재료2",
"Taste1:Taste_Enum": "맛1",
"Taste2:Taste_Enum": "맛2",
"Sprite:Sprite": "Addressable 이미지 이름"
},
{
"Id:string": "Food001",
"Name:string": "햇빛수프",
"Ingredient1:string": "극락쌀",
"Ingredient2:string": "햇빛당근",
"Taste1:Taste_Enum": "Bitter",
"Taste2:Taste_Enum": "Sweet",
"Sprite:Sprite": "Gold"
},
{
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 222,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
},
{
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 333,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
},
{
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 444,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""
}
],
"Monster": [
{
"Id": "식별번호",
"Name": "이름",
"T1": "테스트1"
},
{
"Id": "Test001",
"Name": "A",
"T1": 1
},
{
"Id": "Test002",
"Name": "B",
"T1": 2
},
{
"Id": "Test003",
"Name": "C",
"T1": 3
},
{
"Id": "Test004",
"Name": "D",
"T1": 4
}
]
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: cd40e1a2187a0764e8770d553ae71bd4
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,81 @@
{
"$개요": [
{
"": "시트 생성"
}
],
"Food": [
{
"Id:string": "식별ID",
"Name:string": "이름",
"Ingredient1:string": "재료1",
"Ingredient2:string": "재료2",
"Taste1:Taste_Enum": "맛1",
"Taste2:Taste_Enum": "맛2",
"Sprite:Sprite": "Addressable 이미지 이름"
},
{
"Id:string": "Food001",
"Name:string": "햇빛수프",
"Ingredient1:string": "극락쌀",
"Ingredient2:string": "햇빛당근",
"Taste1:Taste_Enum": "Bitter",
"Taste2:Taste_Enum": "Sweet",
"Sprite:Sprite": "Gold"
},
{
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 8,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
},
{
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 6,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
},
{
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 7,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""
}
],
"Monster": [
{
"Id": "식별번호",
"Name": "이름",
"T1": "테스트1"
},
{
"Id": "Test001",
"Name": "A",
"T1": 1
},
{
"Id": "Test002",
"Name": "B",
"T1": 2
},
{
"Id": "Test003",
"Name": "C",
"T1": 3
},
{
"Id": "Test004",
"Name": "D",
"T1": 4
}
]
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d2ca60b3390812642a7c5d3f4f2315a5
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,81 @@
{
"$개요": [
{
"": "시트 생성"
}
],
"Food": [
{
"Id:string": "식별ID",
"Name:string": "이름",
"Ingredient1:string": "재료1",
"Ingredient2:string": "재료2",
"Taste1:Taste_Enum": "맛1",
"Taste2:Taste_Enum": "맛2",
"Sprite:Sprite": "Addressable 이미지 이름"
},
{
"Id:string": "Food001",
"Name:string": "햇빛수프",
"Ingredient1:string": "극락쌀",
"Ingredient2:string": "햇빛당근",
"Taste1:Taste_Enum": "Bitter",
"Taste2:Taste_Enum": "Sweet",
"Sprite:Sprite": "Gold"
},
{
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 123123,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
},
{
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 123123,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
},
{
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 123123,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""
}
],
"Monster": [
{
"Id": "식별번호",
"Name": "이름",
"T1": "테스트1"
},
{
"Id": "Test001",
"Name": "A",
"T1": 1
},
{
"Id": "Test002",
"Name": "B",
"T1": 2
},
{
"Id": "Test003",
"Name": "C",
"T1": 3
},
{
"Id": "Test004",
"Name": "D",
"T1": 4
}
]
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 310fc35bc8fc3fb4d8428fde47834a19
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,81 @@
{
"$개요": [
{
"": "시트 생성"
}
],
"Food": [
{
"Id:string": "식별ID",
"Name:string": "이름",
"Ingredient1:string": "재료1",
"Ingredient2:string": "재료2",
"Taste1:Taste_Enum": "맛1",
"Taste2:Taste_Enum": "맛2",
"Sprite:Sprite": "Addressable 이미지 이름"
},
{
"Id:string": "Food001",
"Name:string": "햇빛수프",
"Ingredient1:string": "극락쌀",
"Ingredient2:string": "햇빛당근",
"Taste1:Taste_Enum": "Bitter",
"Taste2:Taste_Enum": "Sweet",
"Sprite:Sprite": "Gold"
},
{
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 1,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
},
{
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 1,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
},
{
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 1,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""
}
],
"Monster": [
{
"Id": "식별번호",
"Name": "이름",
"T1": "테스트1"
},
{
"Id": "Test001",
"Name": "A",
"T1": 1
},
{
"Id": "Test002",
"Name": "B",
"T1": 2
},
{
"Id": "Test003",
"Name": "C",
"T1": 3
},
{
"Id": "Test004",
"Name": "D",
"T1": 4
}
]
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e554e55047455884493dac8eadb77222
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,2 +1,2 @@
fileFormatVersion: 2
guid: 2714e362cc5f51346a94b6da1f2a68f8
guid: ba9b1a4c8af1e73408126a6a97be8423

View File

@ -1,2 +1,2 @@
fileFormatVersion: 2
guid: 8693b42dca1bad640aad102399faa440
guid: dce45c629bff82849ae40a08e605ce13

View File

@ -1,2 +1,2 @@
fileFormatVersion: 2
guid: d9a7e15d3d3df5f4a989d1e2e92682e6
guid: 80338c211c1fbc44f9fc1827b83ce50f

View File

@ -27,7 +27,7 @@
"Id:string": "Food002",
"Name:string": "B",
"Ingredient1:string": 1,
"Ingredient2:string": 4,
"Ingredient2:string": 1,
"Taste1:Taste_Enum": "Spicy",
"Taste2:Taste_Enum": "Bitter",
"Sprite:Sprite": ""
@ -36,7 +36,7 @@
"Id:string": "Food003",
"Name:string": "C",
"Ingredient1:string": 2,
"Ingredient2:string": 5,
"Ingredient2:string": 1,
"Taste1:Taste_Enum": "Fresh",
"Taste2:Taste_Enum": "None",
"Sprite:Sprite": ""
@ -45,7 +45,7 @@
"Id:string": "Food004",
"Name:string": "D",
"Ingredient1:string": 3,
"Ingredient2:string": 6,
"Ingredient2:string": 1,
"Taste1:Taste_Enum": "Sour",
"Taste2:Taste_Enum": "Salty",
"Sprite:Sprite": ""

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 70eea4fed7f314a4492ac4a97380d4b1
guid: 76740917292abb542b69fe09178e5bfa
TextScriptImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 593c063d566ca254c88f17d5d7ed1b36
guid: 53d86386d682bb445ba3b231e83086c6
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
_logs:
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 15:02:17
Timestamp: 2025-05-13 16:28:35
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
@ -40,4 +40,251 @@ MonoBehaviour:
\"B\",\n \"T1\": 2\n },\n {\n \"Id\": \"Test003\",\n \"Name\":
\"C\",\n \"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\":
\"D\",\n \"T1\": 4\n }\n ]\n}"
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 16:30:24
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
\"Ingredient2:string\": \"\uC7AC\uB8CC2\",\n \"Taste1:Taste_Enum\": \"\uB9DB1\",\n
\"Taste2:Taste_Enum\": \"\uB9DB2\",\n \"Sprite:Sprite\": \"Addressable
\uC774\uBBF8\uC9C0 \uC774\uB984\"\n },\n {\n \"Id:string\": \"Food001\",\n
\"Name:string\": \"\uD587\uBE5B\uC218\uD504\",\n \"Ingredient1:string\":
\"\uADF9\uB77D\uC300\",\n \"Ingredient2:string\": \"\uD587\uBE5B\uB2F9\uADFC\",\n
\"Taste1:Taste_Enum\": \"Bitter\",\n \"Taste2:Taste_Enum\": \"Sweet\",\n
\"Sprite:Sprite\": \"Gold\"\n },\n {\n \"Id:string\": \"Food002\",\n
\"Name:string\": \"B\",\n \"Ingredient1:string\": 1,\n \"Ingredient2:string\":
11,\n \"Taste1:Taste_Enum\": \"Spicy\",\n \"Taste2:Taste_Enum\":
\"Bitter\",\n \"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\":
\"Food003\",\n \"Name:string\": \"C\",\n \"Ingredient1:string\":
2,\n \"Ingredient2:string\": 22,\n \"Taste1:Taste_Enum\": \"Fresh\",\n
\"Taste2:Taste_Enum\": \"None\",\n \"Sprite:Sprite\": \"\"\n },\n
{\n \"Id:string\": \"Food004\",\n \"Name:string\": \"D\",\n
\"Ingredient1:string\": 3,\n \"Ingredient2:string\": 33,\n \"Taste1:Taste_Enum\":
\"Sour\",\n \"Taste2:Taste_Enum\": \"Salty\",\n \"Sprite:Sprite\":
\"\"\n }\n ],\n \"Monster\": [\n {\n \"Id\": \"\uC2DD\uBCC4\uBC88\uD638\",\n
\"Name\": \"\uC774\uB984\",\n \"T1\": \"\uD14C\uC2A4\uD2B81\"\n },\n
{\n \"Id\": \"Test001\",\n \"Name\": \"A\",\n \"T1\": 1\n
},\n {\n \"Id\": \"Test002\",\n \"Name\": \"B\",\n \"T1\":
2\n },\n {\n \"Id\": \"Test003\",\n \"Name\": \"C\",\n
\"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\": \"D\",\n
\"T1\": 4\n }\n ]\n}"
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 16:37:27
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
\"Ingredient2:string\": \"\uC7AC\uB8CC2\",\n \"Taste1:Taste_Enum\": \"\uB9DB1\",\n
\"Taste2:Taste_Enum\": \"\uB9DB2\",\n \"Sprite:Sprite\": \"Addressable
\uC774\uBBF8\uC9C0 \uC774\uB984\"\n },\n {\n \"Id:string\": \"Food001\",\n
\"Name:string\": \"\uD587\uBE5B\uC218\uD504\",\n \"Ingredient1:string\":
\"\uADF9\uB77D\uC300\",\n \"Ingredient2:string\": \"\uD587\uBE5B\uB2F9\uADFC\",\n
\"Taste1:Taste_Enum\": \"Bitter\",\n \"Taste2:Taste_Enum\": \"Sweet\",\n
\"Sprite:Sprite\": \"Gold\"\n },\n {\n \"Id:string\": \"Food002\",\n
\"Name:string\": \"B\",\n \"Ingredient1:string\": 1,\n \"Ingredient2:string\":
7,\n \"Taste1:Taste_Enum\": \"Spicy\",\n \"Taste2:Taste_Enum\": \"Bitter\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food003\",\n
\"Name:string\": \"C\",\n \"Ingredient1:string\": 2,\n \"Ingredient2:string\":
7,\n \"Taste1:Taste_Enum\": \"Fresh\",\n \"Taste2:Taste_Enum\": \"None\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food004\",\n
\"Name:string\": \"D\",\n \"Ingredient1:string\": 3,\n \"Ingredient2:string\":
7,\n \"Taste1:Taste_Enum\": \"Sour\",\n \"Taste2:Taste_Enum\": \"Salty\",\n
\"Sprite:Sprite\": \"\"\n }\n ],\n \"Monster\": [\n {\n \"Id\":
\"\uC2DD\uBCC4\uBC88\uD638\",\n \"Name\": \"\uC774\uB984\",\n \"T1\":
\"\uD14C\uC2A4\uD2B81\"\n },\n {\n \"Id\": \"Test001\",\n \"Name\":
\"A\",\n \"T1\": 1\n },\n {\n \"Id\": \"Test002\",\n \"Name\":
\"B\",\n \"T1\": 2\n },\n {\n \"Id\": \"Test003\",\n \"Name\":
\"C\",\n \"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\":
\"D\",\n \"T1\": 4\n }\n ]\n}"
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 16:39:30
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
\"Ingredient2:string\": \"\uC7AC\uB8CC2\",\n \"Taste1:Taste_Enum\": \"\uB9DB1\",\n
\"Taste2:Taste_Enum\": \"\uB9DB2\",\n \"Sprite:Sprite\": \"Addressable
\uC774\uBBF8\uC9C0 \uC774\uB984\"\n },\n {\n \"Id:string\": \"Food001\",\n
\"Name:string\": \"\uD587\uBE5B\uC218\uD504\",\n \"Ingredient1:string\":
\"\uADF9\uB77D\uC300\",\n \"Ingredient2:string\": \"\uD587\uBE5B\uB2F9\uADFC\",\n
\"Taste1:Taste_Enum\": \"Bitter\",\n \"Taste2:Taste_Enum\": \"Sweet\",\n
\"Sprite:Sprite\": \"Gold\"\n },\n {\n \"Id:string\": \"Food002\",\n
\"Name:string\": \"B\",\n \"Ingredient1:string\": 1,\n \"Ingredient2:string\":
8,\n \"Taste1:Taste_Enum\": \"Spicy\",\n \"Taste2:Taste_Enum\": \"Bitter\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food003\",\n
\"Name:string\": \"C\",\n \"Ingredient1:string\": 2,\n \"Ingredient2:string\":
8,\n \"Taste1:Taste_Enum\": \"Fresh\",\n \"Taste2:Taste_Enum\": \"None\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food004\",\n
\"Name:string\": \"D\",\n \"Ingredient1:string\": 3,\n \"Ingredient2:string\":
8,\n \"Taste1:Taste_Enum\": \"Sour\",\n \"Taste2:Taste_Enum\": \"Salty\",\n
\"Sprite:Sprite\": \"\"\n }\n ],\n \"Monster\": [\n {\n \"Id\":
\"\uC2DD\uBCC4\uBC88\uD638\",\n \"Name\": \"\uC774\uB984\",\n \"T1\":
\"\uD14C\uC2A4\uD2B81\"\n },\n {\n \"Id\": \"Test001\",\n \"Name\":
\"A\",\n \"T1\": 1\n },\n {\n \"Id\": \"Test002\",\n \"Name\":
\"B\",\n \"T1\": 2\n },\n {\n \"Id\": \"Test003\",\n \"Name\":
\"C\",\n \"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\":
\"D\",\n \"T1\": 4\n }\n ]\n}"
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 16:40:46
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
\"Ingredient2:string\": \"\uC7AC\uB8CC2\",\n \"Taste1:Taste_Enum\": \"\uB9DB1\",\n
\"Taste2:Taste_Enum\": \"\uB9DB2\",\n \"Sprite:Sprite\": \"Addressable
\uC774\uBBF8\uC9C0 \uC774\uB984\"\n },\n {\n \"Id:string\": \"Food001\",\n
\"Name:string\": \"\uD587\uBE5B\uC218\uD504\",\n \"Ingredient1:string\":
\"\uADF9\uB77D\uC300\",\n \"Ingredient2:string\": \"\uD587\uBE5B\uB2F9\uADFC\",\n
\"Taste1:Taste_Enum\": \"Bitter\",\n \"Taste2:Taste_Enum\": \"Sweet\",\n
\"Sprite:Sprite\": \"Gold\"\n },\n {\n \"Id:string\": \"Food002\",\n
\"Name:string\": \"B\",\n \"Ingredient1:string\": 1,\n \"Ingredient2:string\":
9,\n \"Taste1:Taste_Enum\": \"Spicy\",\n \"Taste2:Taste_Enum\": \"Bitter\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food003\",\n
\"Name:string\": \"C\",\n \"Ingredient1:string\": 2,\n \"Ingredient2:string\":
9,\n \"Taste1:Taste_Enum\": \"Fresh\",\n \"Taste2:Taste_Enum\": \"None\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food004\",\n
\"Name:string\": \"D\",\n \"Ingredient1:string\": 3,\n \"Ingredient2:string\":
9,\n \"Taste1:Taste_Enum\": \"Sour\",\n \"Taste2:Taste_Enum\": \"Salty\",\n
\"Sprite:Sprite\": \"\"\n }\n ],\n \"Monster\": [\n {\n \"Id\":
\"\uC2DD\uBCC4\uBC88\uD638\",\n \"Name\": \"\uC774\uB984\",\n \"T1\":
\"\uD14C\uC2A4\uD2B81\"\n },\n {\n \"Id\": \"Test001\",\n \"Name\":
\"A\",\n \"T1\": 1\n },\n {\n \"Id\": \"Test002\",\n \"Name\":
\"B\",\n \"T1\": 2\n },\n {\n \"Id\": \"Test003\",\n \"Name\":
\"C\",\n \"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\":
\"D\",\n \"T1\": 4\n }\n ]\n}"
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 16:41:55
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
\"Ingredient2:string\": \"\uC7AC\uB8CC2\",\n \"Taste1:Taste_Enum\": \"\uB9DB1\",\n
\"Taste2:Taste_Enum\": \"\uB9DB2\",\n \"Sprite:Sprite\": \"Addressable
\uC774\uBBF8\uC9C0 \uC774\uB984\"\n },\n {\n \"Id:string\": \"Food001\",\n
\"Name:string\": \"\uD587\uBE5B\uC218\uD504\",\n \"Ingredient1:string\":
\"\uADF9\uB77D\uC300\",\n \"Ingredient2:string\": \"\uD587\uBE5B\uB2F9\uADFC\",\n
\"Taste1:Taste_Enum\": \"Bitter\",\n \"Taste2:Taste_Enum\": \"Sweet\",\n
\"Sprite:Sprite\": \"Gold\"\n },\n {\n \"Id:string\": \"Food002\",\n
\"Name:string\": \"B\",\n \"Ingredient1:string\": 1,\n \"Ingredient2:string\":
333,\n \"Taste1:Taste_Enum\": \"Spicy\",\n \"Taste2:Taste_Enum\":
\"Bitter\",\n \"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\":
\"Food003\",\n \"Name:string\": \"C\",\n \"Ingredient1:string\":
2,\n \"Ingredient2:string\": 444,\n \"Taste1:Taste_Enum\": \"Fresh\",\n
\"Taste2:Taste_Enum\": \"None\",\n \"Sprite:Sprite\": \"\"\n },\n
{\n \"Id:string\": \"Food004\",\n \"Name:string\": \"D\",\n
\"Ingredient1:string\": 3,\n \"Ingredient2:string\": 555,\n \"Taste1:Taste_Enum\":
\"Sour\",\n \"Taste2:Taste_Enum\": \"Salty\",\n \"Sprite:Sprite\":
\"\"\n }\n ],\n \"Monster\": [\n {\n \"Id\": \"\uC2DD\uBCC4\uBC88\uD638\",\n
\"Name\": \"\uC774\uB984\",\n \"T1\": \"\uD14C\uC2A4\uD2B81\"\n },\n
{\n \"Id\": \"Test001\",\n \"Name\": \"A\",\n \"T1\": 1\n
},\n {\n \"Id\": \"Test002\",\n \"Name\": \"B\",\n \"T1\":
2\n },\n {\n \"Id\": \"Test003\",\n \"Name\": \"C\",\n
\"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\": \"D\",\n
\"T1\": 4\n }\n ]\n}"
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 16:43:04
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
\"Ingredient2:string\": \"\uC7AC\uB8CC2\",\n \"Taste1:Taste_Enum\": \"\uB9DB1\",\n
\"Taste2:Taste_Enum\": \"\uB9DB2\",\n \"Sprite:Sprite\": \"Addressable
\uC774\uBBF8\uC9C0 \uC774\uB984\"\n },\n {\n \"Id:string\": \"Food001\",\n
\"Name:string\": \"\uD587\uBE5B\uC218\uD504\",\n \"Ingredient1:string\":
\"\uADF9\uB77D\uC300\",\n \"Ingredient2:string\": \"\uD587\uBE5B\uB2F9\uADFC\",\n
\"Taste1:Taste_Enum\": \"Bitter\",\n \"Taste2:Taste_Enum\": \"Sweet\",\n
\"Sprite:Sprite\": \"Gold\"\n },\n {\n \"Id:string\": \"Food002\",\n
\"Name:string\": \"B\",\n \"Ingredient1:string\": 1,\n \"Ingredient2:string\":
222,\n \"Taste1:Taste_Enum\": \"Spicy\",\n \"Taste2:Taste_Enum\":
\"Bitter\",\n \"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\":
\"Food003\",\n \"Name:string\": \"C\",\n \"Ingredient1:string\":
2,\n \"Ingredient2:string\": 333,\n \"Taste1:Taste_Enum\": \"Fresh\",\n
\"Taste2:Taste_Enum\": \"None\",\n \"Sprite:Sprite\": \"\"\n },\n
{\n \"Id:string\": \"Food004\",\n \"Name:string\": \"D\",\n
\"Ingredient1:string\": 3,\n \"Ingredient2:string\": 444,\n \"Taste1:Taste_Enum\":
\"Sour\",\n \"Taste2:Taste_Enum\": \"Salty\",\n \"Sprite:Sprite\":
\"\"\n }\n ],\n \"Monster\": [\n {\n \"Id\": \"\uC2DD\uBCC4\uBC88\uD638\",\n
\"Name\": \"\uC774\uB984\",\n \"T1\": \"\uD14C\uC2A4\uD2B81\"\n },\n
{\n \"Id\": \"Test001\",\n \"Name\": \"A\",\n \"T1\": 1\n
},\n {\n \"Id\": \"Test002\",\n \"Name\": \"B\",\n \"T1\":
2\n },\n {\n \"Id\": \"Test003\",\n \"Name\": \"C\",\n
\"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\": \"D\",\n
\"T1\": 4\n }\n ]\n}"
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 16:44:24
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
\"Ingredient2:string\": \"\uC7AC\uB8CC2\",\n \"Taste1:Taste_Enum\": \"\uB9DB1\",\n
\"Taste2:Taste_Enum\": \"\uB9DB2\",\n \"Sprite:Sprite\": \"Addressable
\uC774\uBBF8\uC9C0 \uC774\uB984\"\n },\n {\n \"Id:string\": \"Food001\",\n
\"Name:string\": \"\uD587\uBE5B\uC218\uD504\",\n \"Ingredient1:string\":
\"\uADF9\uB77D\uC300\",\n \"Ingredient2:string\": \"\uD587\uBE5B\uB2F9\uADFC\",\n
\"Taste1:Taste_Enum\": \"Bitter\",\n \"Taste2:Taste_Enum\": \"Sweet\",\n
\"Sprite:Sprite\": \"Gold\"\n },\n {\n \"Id:string\": \"Food002\",\n
\"Name:string\": \"B\",\n \"Ingredient1:string\": 1,\n \"Ingredient2:string\":
8,\n \"Taste1:Taste_Enum\": \"Spicy\",\n \"Taste2:Taste_Enum\": \"Bitter\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food003\",\n
\"Name:string\": \"C\",\n \"Ingredient1:string\": 2,\n \"Ingredient2:string\":
6,\n \"Taste1:Taste_Enum\": \"Fresh\",\n \"Taste2:Taste_Enum\": \"None\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food004\",\n
\"Name:string\": \"D\",\n \"Ingredient1:string\": 3,\n \"Ingredient2:string\":
7,\n \"Taste1:Taste_Enum\": \"Sour\",\n \"Taste2:Taste_Enum\": \"Salty\",\n
\"Sprite:Sprite\": \"\"\n }\n ],\n \"Monster\": [\n {\n \"Id\":
\"\uC2DD\uBCC4\uBC88\uD638\",\n \"Name\": \"\uC774\uB984\",\n \"T1\":
\"\uD14C\uC2A4\uD2B81\"\n },\n {\n \"Id\": \"Test001\",\n \"Name\":
\"A\",\n \"T1\": 1\n },\n {\n \"Id\": \"Test002\",\n \"Name\":
\"B\",\n \"T1\": 2\n },\n {\n \"Id\": \"Test003\",\n \"Name\":
\"C\",\n \"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\":
\"D\",\n \"T1\": 4\n }\n ]\n}"
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 16:46:54
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
\"Ingredient2:string\": \"\uC7AC\uB8CC2\",\n \"Taste1:Taste_Enum\": \"\uB9DB1\",\n
\"Taste2:Taste_Enum\": \"\uB9DB2\",\n \"Sprite:Sprite\": \"Addressable
\uC774\uBBF8\uC9C0 \uC774\uB984\"\n },\n {\n \"Id:string\": \"Food001\",\n
\"Name:string\": \"\uD587\uBE5B\uC218\uD504\",\n \"Ingredient1:string\":
\"\uADF9\uB77D\uC300\",\n \"Ingredient2:string\": \"\uD587\uBE5B\uB2F9\uADFC\",\n
\"Taste1:Taste_Enum\": \"Bitter\",\n \"Taste2:Taste_Enum\": \"Sweet\",\n
\"Sprite:Sprite\": \"Gold\"\n },\n {\n \"Id:string\": \"Food002\",\n
\"Name:string\": \"B\",\n \"Ingredient1:string\": 1,\n \"Ingredient2:string\":
123123,\n \"Taste1:Taste_Enum\": \"Spicy\",\n \"Taste2:Taste_Enum\":
\"Bitter\",\n \"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\":
\"Food003\",\n \"Name:string\": \"C\",\n \"Ingredient1:string\":
2,\n \"Ingredient2:string\": 123123,\n \"Taste1:Taste_Enum\": \"Fresh\",\n
\"Taste2:Taste_Enum\": \"None\",\n \"Sprite:Sprite\": \"\"\n },\n
{\n \"Id:string\": \"Food004\",\n \"Name:string\": \"D\",\n
\"Ingredient1:string\": 3,\n \"Ingredient2:string\": 123123,\n \"Taste1:Taste_Enum\":
\"Sour\",\n \"Taste2:Taste_Enum\": \"Salty\",\n \"Sprite:Sprite\":
\"\"\n }\n ],\n \"Monster\": [\n {\n \"Id\": \"\uC2DD\uBCC4\uBC88\uD638\",\n
\"Name\": \"\uC774\uB984\",\n \"T1\": \"\uD14C\uC2A4\uD2B81\"\n },\n
{\n \"Id\": \"Test001\",\n \"Name\": \"A\",\n \"T1\": 1\n
},\n {\n \"Id\": \"Test002\",\n \"Name\": \"B\",\n \"T1\":
2\n },\n {\n \"Id\": \"Test003\",\n \"Name\": \"C\",\n
\"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\": \"D\",\n
\"T1\": 4\n }\n ]\n}"
- Editor: "\uB0A8\uD0DC\uAC74"
Timestamp: 2025-05-13 16:48:29
JsonSnapshot: "{\n \"$\uAC1C\uC694\": [\n {\n \"\": \"\uC2DC\uD2B8 \uC0DD\uC131\"\n
}\n ],\n \"Food\": [\n {\n \"Id:string\": \"\uC2DD\uBCC4ID\",\n
\"Name:string\": \"\uC774\uB984\",\n \"Ingredient1:string\": \"\uC7AC\uB8CC1\",\n
\"Ingredient2:string\": \"\uC7AC\uB8CC2\",\n \"Taste1:Taste_Enum\": \"\uB9DB1\",\n
\"Taste2:Taste_Enum\": \"\uB9DB2\",\n \"Sprite:Sprite\": \"Addressable
\uC774\uBBF8\uC9C0 \uC774\uB984\"\n },\n {\n \"Id:string\": \"Food001\",\n
\"Name:string\": \"\uD587\uBE5B\uC218\uD504\",\n \"Ingredient1:string\":
\"\uADF9\uB77D\uC300\",\n \"Ingredient2:string\": \"\uD587\uBE5B\uB2F9\uADFC\",\n
\"Taste1:Taste_Enum\": \"Bitter\",\n \"Taste2:Taste_Enum\": \"Sweet\",\n
\"Sprite:Sprite\": \"Gold\"\n },\n {\n \"Id:string\": \"Food002\",\n
\"Name:string\": \"B\",\n \"Ingredient1:string\": 1,\n \"Ingredient2:string\":
1,\n \"Taste1:Taste_Enum\": \"Spicy\",\n \"Taste2:Taste_Enum\": \"Bitter\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food003\",\n
\"Name:string\": \"C\",\n \"Ingredient1:string\": 2,\n \"Ingredient2:string\":
1,\n \"Taste1:Taste_Enum\": \"Fresh\",\n \"Taste2:Taste_Enum\": \"None\",\n
\"Sprite:Sprite\": \"\"\n },\n {\n \"Id:string\": \"Food004\",\n
\"Name:string\": \"D\",\n \"Ingredient1:string\": 3,\n \"Ingredient2:string\":
1,\n \"Taste1:Taste_Enum\": \"Sour\",\n \"Taste2:Taste_Enum\": \"Salty\",\n
\"Sprite:Sprite\": \"\"\n }\n ],\n \"Monster\": [\n {\n \"Id\":
\"\uC2DD\uBCC4\uBC88\uD638\",\n \"Name\": \"\uC774\uB984\",\n \"T1\":
\"\uD14C\uC2A4\uD2B81\"\n },\n {\n \"Id\": \"Test001\",\n \"Name\":
\"A\",\n \"T1\": 1\n },\n {\n \"Id\": \"Test002\",\n \"Name\":
\"B\",\n \"T1\": 2\n },\n {\n \"Id\": \"Test003\",\n \"Name\":
\"C\",\n \"T1\": 3\n },\n {\n \"Id\": \"Test004\",\n \"Name\":
\"D\",\n \"T1\": 4\n }\n ]\n}"
MaxLogs: 100

View File

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

View File

@ -1,2 +1,2 @@
fileFormatVersion: 2
guid: 26a6429de94146a43826ee8860767011
guid: b11551a9f69d3d04aac796eeabead5bb

View File

@ -1,2 +1,2 @@
fileFormatVersion: 2
guid: 8a377050a15fa114cb0d0bd8d0f6bafc
guid: e06f0bd1faff18646b7597ddcf787856

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: d30016576075fac4e84ec728aaeb2806
guid: 78153c2368c8af440ae01521a5ed015d
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -9,7 +9,7 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d9a7e15d3d3df5f4a989d1e2e92682e6, type: 3}
m_Script: {fileID: 11500000, guid: 80338c211c1fbc44f9fc1827b83ce50f, type: 3}
m_Name: FoodSo
m_EditorClassIdentifier:
FoodList:
@ -19,25 +19,25 @@ MonoBehaviour:
Ingredient2: "\uD587\uBE5B\uB2F9\uADFC"
Taste1: 1
Taste2: 2
Sprite: {fileID: 21300000, guid: e15933f76da90e742866563b5cd9e45f, type: 3}
Sprite: {fileID: 0}
- Id: Food002
Name: B
Ingredient1: 1
Ingredient2: 4
Ingredient2: 11
Taste1: 3
Taste2: 1
Sprite: {fileID: 0}
- Id: Food003
Name: C
Ingredient1: 2
Ingredient2: 5
Ingredient2: 22
Taste1: 4
Taste2: 0
Sprite: {fileID: 0}
- Id: Food004
Name: D
Ingredient1: 3
Ingredient2: 6
Ingredient2: 33
Taste1: 5
Taste2: 6
Sprite: {fileID: 0}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 8f6a170dcd0a88d47939e70db303af14
guid: ccb6f7909b5ffd94499bbeaef45086be
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000

View File

@ -9,7 +9,7 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8a377050a15fa114cb0d0bd8d0f6bafc, type: 3}
m_Script: {fileID: 11500000, guid: e06f0bd1faff18646b7597ddcf787856, type: 3}
m_Name: MonsterSo
m_EditorClassIdentifier:
MonsterList:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 2a1b86f3356293441bcfca705fff3b85
guid: 1542a7a4161005c4baf6262cdf5f4ac7
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000

View File

@ -54,6 +54,7 @@ public class GoogleSheetManager : Singleton<GoogleSheetManager>
private string[] _availSheetArray;
private string _json;
private bool _isCreatingSo;
[SerializeField, ReadOnly]
private bool _refreshTrigger;
@ -113,7 +114,16 @@ private async void FetchGoogleSheet()
GoogleSheetDiffViewer.ShowWindow(diffs);
bool isJsonSaved = SaveFileOrSkip(JsonFullPath, _json);
GenerateClassFilesPerSheet(_json);
try
{
GenerateClassFilesPerSheet(_json);
}
catch (Exception e)
{
Debug.LogError($"[GoogleSheetManager] 클래스 파일 생성 중 오류: {e.Message}");
return;
}
if (isJsonSaved)
{
@ -219,7 +229,7 @@ private void CompareWithSelectedVersion()
[BoxGroup("버전 복구")]
[Button("선택한 버전으로 복구")]
private void RestoreSelectedVersion()
private async void RestoreSelectedVersion()
{
var log = AssetDatabase.LoadAssetAtPath<GoogleSheetChangeLog>(ChangeLogAssetPath);
if (log == null || _restoreIndex < 0 || _restoreIndex >= log.Logs.Count)
@ -231,21 +241,19 @@ private void RestoreSelectedVersion()
string restoreJson = log.Logs[_restoreIndex].JsonSnapshot;
string currentJson = File.Exists(JsonFullPath) ? File.ReadAllText(JsonFullPath) : "";
List<GoogleSheetDiff> diffs = GoogleSheetFetchHelper.CompareJsonDiff(currentJson, restoreJson);
var diffs = GoogleSheetFetchHelper.CompareJsonDiff(currentJson, restoreJson);
if (diffs.Count > 0)
GoogleSheetDiffViewer.ShowWindow(diffs); // 변경 전 → 변경 후
GoogleSheetDiffViewer.ShowWindow(diffs);
// 복원 처리
_json = restoreJson;
SaveFileOrSkip(JsonFullPath, _json);
CreateGoogleSheetSo();
_currentVersion = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
await CreateGoogleSheetSoAsync();
_currentVersion = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
Debug.Log($"[{log.Logs[_restoreIndex].Editor}]의 버전으로 복원 완료");
}
/// <summary>
/// 버전 로그 드롭다운 함수
/// </summary>
@ -509,9 +517,70 @@ private string GetCSharpType(JTokenType jsonType)
}
}
private bool CreateGoogleSheetSo()
public async Task<bool> CreateGoogleSheetSoAsync()
{
await Addressables.InitializeAsync().Task;
if (_isCreatingSo)
{
Debug.LogWarning("[GoogleSheetManager] 이미 SO 생성 중입니다. 중복 호출 방지");
return false;
}
_isCreatingSo = true;
bool result = false;
try
{
var checkHandle = Addressables.CheckForCatalogUpdates();
await checkHandle.Task;
bool succeeded = checkHandle.Status == AsyncOperationStatus.Succeeded;
List<string> catalogsToUpdate = succeeded ? new List<string>(checkHandle.Result) : null;
Addressables.Release(checkHandle); // ⛔ 이후 checkHandle 접근 금지!
if (catalogsToUpdate?.Count > 0)
{
var updateHandle = Addressables.UpdateCatalogs(catalogsToUpdate);
await updateHandle.Task;
if (updateHandle.Status == AsyncOperationStatus.Succeeded)
Debug.Log("카탈로그 업데이트 성공");
else
Debug.LogError("카탈로그 업데이트 실패");
Addressables.Release(updateHandle);
}
else
{
Debug.Log("[GoogleSheetManager] Addressables 카탈로그는 최신 상태입니다.");
}
result = await InternalCreateGoogleSheetSoAsync();
}
catch (Exception e)
{
Debug.LogError($"[GoogleSheetManager] SO 생성 중 예외 발생: {e}");
}
finally
{
_isCreatingSo = false;
}
return result;
}
public async Task<bool> InternalCreateGoogleSheetSoAsync()
{
JObject jsonObject = JObject.Parse(_json);
if (string.IsNullOrEmpty(_json))
{
Debug.LogError("[GoogleSheetManager] JSON 데이터가 비어있어 SO 생성을 중단합니다.");
return false;
}
bool allSuccess = true;
foreach (var sheetPair in jsonObject)
@ -539,14 +608,25 @@ private bool CreateGoogleSheetSo()
string soPath = $"{soDirectory}/{sheetName}So.asset";
ScriptableObject soInstance = AssetDatabase.LoadAssetAtPath<ScriptableObject>(soPath);
// 💡 잘못된 asset이면 삭제 후 새로 생성
if (soInstance == null)
{
if (File.Exists(soPath))
{
Debug.LogWarning($"[GoogleSheetManager] 잘못된 SO 파일 제거: {soPath}");
AssetDatabase.DeleteAsset(soPath);
}
soInstance = ScriptableObject.CreateInstance(soType);
AssetDatabase.CreateAsset(soInstance, soPath);
AssetDatabase.SaveAssets();
AssetDatabase.ImportAsset(soPath, ImportAssetOptions.ForceSynchronousImport);
await Task.Delay(100); // meta 확정 시간 확보
AssetDatabase.Refresh();
}
GoogleSheetAddressableAutoSetup.AutoRegisterSo(soPath);
// 🧠 Sprite나 Enum 값을 반영한 List<T> 생성
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(dataType));
var dataArray = (JArray)sheetPair.Value;
@ -584,41 +664,33 @@ private bool CreateGoogleSheetSo()
try
{
object value;
object value = null;
// ✅ Sprite 처리
// ✅ Sprite 처리 (주소로부터 비동기 로드)
if (explicitType == "Sprite" && field.FieldType == typeof(Sprite))
{
string key = prop.Value.ToString().Trim();
if (string.IsNullOrEmpty(key))
string spriteKey = prop.Value.ToString().Trim();
if (string.IsNullOrEmpty(spriteKey))
continue;
if (!AddressableManager.HasLabel(spriteKey, "GoogleSheetSprite"))
{
Debug.Log($"[GoogleSheetManager] Sprite 키가 비어 있어 {fieldName} 건너뜀");
Debug.LogWarning($"[GoogleSheetManager] Sprite 라벨 없음: {spriteKey}");
continue;
}
#if UNITY_EDITOR
if (!AddressableManager.HasLabel(key, "GoogleSheetSprite"))
var handle = Addressables.LoadAssetAsync<Sprite>(spriteKey);
await handle.Task;
if (handle.Status != AsyncOperationStatus.Succeeded || handle.Result == null)
{
Debug.LogWarning($"[GoogleSheetManager] '{key}'는 GoogleSheetSprite 라벨 없음");
Debug.LogWarning($"[GoogleSheetManager] Sprite 로드 실패 또는 null: {spriteKey}");
continue;
}
var handle = Addressables.LoadAssetAsync<Sprite>(key);
var sprite = handle.WaitForCompletion();
Debug.Log($"[GoogleSheetManager] '{key}' 로딩 결과: {sprite} / 상태: {handle.Status}");
if (handle.Status == AsyncOperationStatus.Succeeded && sprite != null)
{
field.SetValue(dataInstance, sprite);
Debug.Log($"[GoogleSheetManager] {fieldName} <- {sprite.name} 반영됨");
}
else
{
Debug.LogWarning($"[GoogleSheetManager] Sprite 로드 실패 또는 null: {key}");
}
#endif
continue;
value = handle.Result;
field.SetValue(dataInstance, value);
continue; // 이후 변환 스킵
}
// ✅ Enum 처리
@ -655,6 +727,7 @@ private bool CreateGoogleSheetSo()
list.Add(dataInstance);
}
// ✅ 리스트 필드에 값 설정
FieldInfo listField = soType.GetField($"{sheetName}List",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
@ -671,9 +744,19 @@ private bool CreateGoogleSheetSo()
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
// ✅ Addressables 등록은 마지막에, 유효한 경우만
if (AssetDatabase.LoadAssetAtPath<ScriptableObject>(soPath) != null)
{
GoogleSheetAddressableAutoSetup.AutoRegisterSo(soPath);
}
else
{
Debug.LogWarning($"[GoogleSheetManager] Addressables 등록 생략: {soPath} 불완전");
}
}
Debug.Log("✅ 시트별 ScriptableObject 생성 및 데이터 반영 완료");
Debug.Log("✅ [CreateGoogleSheetSoAsync] 시트별 ScriptableObject 생성 및 반영 완료");
return allSuccess;
}
@ -694,29 +777,28 @@ private string NormalizeEnumKey(string input)
private void OnValidate()
{
if (_refreshTrigger && !_alreadyCreatedSo)
if (_refreshTrigger && !_alreadyCreatedSo && EditorPrefs.GetBool("GoogleSheetManager_ShouldCreateSO"))
{
if (string.IsNullOrEmpty(_json))
{
Debug.LogWarning("[GoogleSheetManager] _json이 null이므로 SO 생성을 건너뜁니다.");
return;
}
_refreshTrigger = false;
_alreadyCreatedSo = true;
DelayedSoCreation();
EditorPrefs.SetBool("GoogleSheetManager_ShouldCreateSO", false); // 재실행 방지
EditorApplication.delayCall += () =>
{
_ = DelayAndCreateSo(); // 무시 가능한 비동기
};
}
}
private void DelayedSoCreation()
private async Task DelayAndCreateSo()
{
if (CreateGoogleSheetSo())
await Task.Delay(300); // 300ms 지연 (너무 짧으면 반영 안됨)
if (!string.IsNullOrEmpty(_json))
{
Debug.Log("Fetch done. SO 업데이트 완료");
}
else
{
Debug.LogWarning("[GoogleSheetManager] SO 생성 실패. 수동으로 Fetch를 다시 시도하세요.");
bool success = await CreateGoogleSheetSoAsync();
Debug.Log(success ? "Fetch done. SO 업데이트 완료" : "SO 생성 실패. 수동으로 Fetch를 다시 시도하세요.");
}
}
@ -744,17 +826,19 @@ private IEnumerator ReloadRoutine()
if (!string.IsNullOrEmpty(_json))
{
CreateGoogleSheetSo();
var soTask = CreateGoogleSheetSoAsync();
yield return new WaitUntil(() => soTask.IsCompleted);
Debug.Log("런타임 데이터 재적용 완료");
}
}
public void CreateSoAfterScriptReload()
public async void CreateSoAfterScriptReload()
{
if (_json != null)
{
Debug.Log("[GoogleSheetManager] Script Reload 이후 SO 생성 실행");
CreateGoogleSheetSo();
await CreateGoogleSheetSoAsync();
}
}
#endif