[๊ฐ๋ฐ ์ผ์ง #2] ๊ตฌ๊ธ ์ํธ API ์ฐ๋, ์ ๋ํฐ ScriptableObjectํ (1)
์ฝ๋ ์ดํดํ๋๋ฐ ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ ค์ ๊ฐ๊ฒฉ์ด ๊ธธ์ด์ก์ต๋๋ค.
*๊ธ์ ์ ์ ํ์ ๊ฑธ๋ ค์ ๊ธ์ 2๊ฐ๋ก ๋๋์ด ์ฌ๋ ธ์ต๋๋ค.
๊ตฌ๊ธ ์ํธ API์ฐ๋์ ํ๊ธฐ ์ํด์ย

GCP์ฝ์ ์ ์ ์ํด์ผ ๋ฉ๋๋ค.ย
๋งํฌ :ย Google Cloud Console
๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ฝ์์ ๋ค์ด๊ฐ์ API๋ฅผ ํ์ฑํํด์ผ ๋๋๋ฐย
๋ฉ์ธํ๋ฉด์์ย

๋น ๋ฅธ ์ก์ธ์ค ๋ฒํผ์ ์ฐพ์์ ๋๋ฌ์ฃผ๋ฉด ์๋ ์ฌ์ง๊ณผ ๊ฐ์ ์ฐฝ์ด ๋ํ๋ฉ๋๋ค.


๋จผ์ ํ๋ก์ ํธ๋ฅผ ์์ฑ ๋ฒํผ์ ๋๋ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํด์ค๋๋ค.ย ย

๊ทธ ๋ค์์ผ๋ก ์ข์ธก์ API ๋ฐ ์๋น์ค ํญ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ด๋ํ ๋ค, Google Sheets API๋ฅผ ๊ฒ์ํ์ฌ ์ฌ์ฉ ๋ฒํผ์ ๋๋ฌ์ฃผ๋ฉด ๋ฉ๋๋ค.
์ฌ์ฉ ๋ฒํผ์ ๋๋ฅธ ๋ค์ API ๋ฐ ์๋น์ค > ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ก ์ด๋ํฉ๋๋ค.

์๋จ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํ๊ณ APIํค๋ฅผ ์ ํํ๊ณ ๋์ค๋ ๋ฌธ์์ด์ ๋ฉ๋ชจ์ฅ์ ๋ณต์ฌํด๋๋ฉด ๋ฉ๋๋ค.ย
๋ค์์ ๊ตฌ๊ธ ์ํธ ์์ชฝ์ URL์ ๋ณด์๋ฉด
ย ย ย ย ย ย ย ์ฌ๊ธฐ ๋น ๊ณต๋ฐฑ ๋ถ๋ถย ย ย ย ย ย ย ย ย ย ย 
์ ๋งํฌ ์ฌ์ง์ ๊ณต๋ฐฑ ๋ถ๋ถ์ด ์ด ์ํธ์ ๊ณ ์ ID(Spreadsheet ID)์
๋๋ค.
์ด๋ฅผ ๋ณต์ฌํ๊ณ ย
์ํธ์ ๊ณต์ ๋ฒํผ์ ๋๋ฌ ๋งํฌ๊ฐ ์๋ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์์(๋ทฐ์ด)๋ก ๋ณ๊ฒฝํด์ค๋๋ค.ย
using UnityEngine;
using UnityEditor;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
public class GoogleSheetImporter : EditorWindow
{
ย ย private const string SHEET_ID = "์ด๋ถ๋ถ ์ํธ ID๋ก ๊ต์ฒดํ์ธ์"; //
ย ย private const string API_KEY = "์ด๋ถ๋ถ API ํค๋ก ๊ต์ฒดํ์ธ์";
ย ย
ย ย // ๊ฐ์ ธ์ฌ ์ํธ๋ค์ ์ด๋ฆ์ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํฉ๋๋ค. (์์
ํ๋จ์ ์ํธ๋ช
๊ณผ ์ ํํ ์ผ์นํด์ผ ํจ)
ย ย private static readonly string[] sheetNames = new string[]
ย ย {
ย ย ย ย "Nodes",
ย ย ย ย "SelectNodes",
ย ย ย ย "Localization_Dialogue",
ย ย ย ย "Localization_UI",
ย ย ย ย "Localization_Record",
ย ย ย ย "EventList"
ย ย };
ย ย [MenuItem("Data/Import All Google Sheets")]
ย ย public static async void ImportAllSheets()
ย ย {
ย ย ย ย Debug.Log("๋ค์ค ๊ตฌ๊ธ ์ํธ ๋ฐ์ดํฐ ๋ค์ด๋ก๋ ์์...");
ย ย ย ย using (HttpClient client = new HttpClient())
ย ย ย ย {
ย ย ย ย ย ย // ๋ฐฐ์ด์ ๋ฑ๋ก๋ ์ํธ ๊ฐ์๋งํผ ๋ฐ๋ณต๋ฌธ์ ์คํํฉ๋๋ค.
ย ย ย ย ย ย foreach (string sheetName in sheetNames)
ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย // A1:Z1000์ ๋๋ํ๊ฒ ์ก์ ๋ฒ์์
๋๋ค. ํ์์ ๋ฐ๋ผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ด์ญ์์ค.
ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย try
ย ย ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย ย ย HttpResponseMessage response = await client.GetAsync(url);
ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย if (response.IsSuccessStatusCode)
ย ย ย ย ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย ย ย ย ย string jsonResponse = await response.Content.ReadAsStringAsync();
ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย // ์ํธ ์ด๋ฆ์ผ๋ก ๊ฐ๊ฐ์ JSON ํ์ผ์ ์์ฑํฉ๋๋ค.
ย ย ย ย ย ย ย ย ย ย ย ย string savePath = Application.dataPath + $"/Resources/Data/{sheetName}.json";
ย ย ย ย ย ย ย ย ย ย ย ย
ย ย ย ย ย ย ย ย ย ย ย ย Directory.CreateDirectory(Path.GetDirectoryName(savePath));
ย ย ย ย ย ย ย ย ย ย ย ย File.WriteAllText(savePath, jsonResponse);
ย ย ย ย ย ย ย ย ย ย ย ย Debug.Log($"[{sheetName}] ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฅ ์ฑ๊ณต!");
ย ย ย ย ย ย ย ย ย ย }
ย ย ย ย ย ย ย ย ย ย else
ย ย ย ย ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย ย ย ย ย Debug.LogError($"[{sheetName}] ๋ค์ด๋ก๋ ์คํจ. ์ํ ์ฝ๋: {response.StatusCode}. ์ํธ ์ด๋ฆ์ด๋ ๋ฒ์๋ฅผ ํ์ธํ์ธ์.");
ย ย ย ย ย ย ย ย ย ย }
ย ย ย ย ย ย ย ย }
ย ย ย ย ย ย ย ย catch (HttpRequestException e)
ย ย ย ย ย ย ย ย {
ย ย ย ย ย ย ย ย ย ย Debug.LogError($"[{sheetName}] ๋คํธ์ํฌ ์์ฒญ ์๋ฌ: {e.Message}");
ย ย ย ย ย ย ย ย }
ย ย ย ย ย ย }
ย ย ย ย ย ย
ย ย ย ย ย ย // ๋ชจ๋ ๋ค์ด๋ก๋๊ฐ ๋๋ ํ ์๋ํฐ๋ฅผ ํ ๋ฒ๋ง ์๋ก๊ณ ์นจํฉ๋๋ค.
ย ย ย ย ย ย AssetDatabase.Refresh();
ย ย ย ย ย ย Debug.Log("๋ชจ๋ ์ํธ ๋ค์ด๋ก๋ ๋ฐ ๊ฐฑ์ ์๋ฃ!");
ย ย ย ย }
ย ย }
}
SHEET_ID
API_KEY
๋ค์ ๋ณ์๋ค์ ๋ณต์ฌํด ๋์๋ ์์ด๋์ ํค๋ฅผ ์
๋ ฅํด์ฃผ๋ฉด ๋๊ณ .
sheetNames ย ์๋ ๋ถ๋ฌ์ฌ ์ํธ ์ด๋ฆ์ ์ ์ด์ฃผ์๋ฉด ๋ฉ๋๋ค.ย
์ด ์คํฌ๋ฆฝํธ๋ ๋น๋ ํ์ผ์ ํฌํจ๋๋ฉด ์ ๋๋ฏ๋ก, ๋ฐ๋์ ์ ๋ํฐ ํ๋ก์ ํธ ํจ๋์์ Editor๋ผ๋ ์ด๋ฆ์ ํด๋๋ฅผ ์์ฑํ ๋ค ๊ทธ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฅํ๊ฒ ๋๋ฉด
์์ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋ฉด ์ ๋ํฐ ์๋ํฐ ์๋จ์ Data -> Import Google Sheet ๋ฒํผ์ ๋๋ฅด๋ ๊ฒ ๋ง์ผ๋ก ์ํธ ๋ฐ์ดํฐ๊ฐ ๋ก์ปฌ JSON ํ์ผ๋ก ์ฆ์ ์ ์ฅ๋ฉ๋๋ค.

ํด๋น ๊ณผ์ ์ผ๋ก ์ด์ ์ํธ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด์ ๊ท์ฐฎ์ ๊ณผ์ ์ ๋ํญ ์ค์์ต๋๋ค.
*๋ค์ ๋ด์ฉ์ ๋ค์ ๊ธ์
๋๊ธ 1