[๊ฐœ๋ฐœ ์ผ์ง€ #2] ๊ตฌ๊ธ€ ์‹œํŠธ API ์—ฐ๋™, ์œ ๋‹ˆํ‹ฐ ScriptableObjectํ™” (1)


์ฝ”๋“œ ์ดํ•ดํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ ค์„œ ๊ฐ„๊ฒฉ์ด ๊ธธ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

*๊ธ€์ž ์ˆ˜ ์ œํ•œ์— ๊ฑธ๋ ค์„œ ๊ธ€์„ 2๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.



[์‹œ๋ฆฌ์ฆˆ] ์ฐจ์› ๋„์„œ๊ด€(๊ฐ€์ œ) ๊ฐœ๋ฐœ์ผ์ง€
ยท ์ฐจ์› ๋„์„œ๊ด€(๊ฐ€์ œ) ๊ฐœ๋ฐœ ์ผ์ง€ [1์ฐจ]


๊ตฌ๊ธ€ ์‹œํŠธ API์—ฐ๋Œ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œย 



a04424ad2c06782ab47e5a67ee91766dc28df1ecd7acc7cbbf10dbc35cd2d421d7fed2f37cb5924249428c6b77

GCP์ฝ˜์†” ์— ์ ‘์†ํ•ด์•ผ ๋ฉ๋‹ˆ๋‹ค.ย 

๋งํฌ :ย Google Cloud Console


๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์— ๋“ค์–ด๊ฐ€์„œ API๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ๋˜๋Š”๋ฐย 



๋ฉ”์ธํ™”๋ฉด์—์„œย 


a04424ad2c06782ab47e5a67ee91766dc28df1ecd7acc7cbbf10dbc35cd4d62158827bb0adc91234f4adb1010e


๋น ๋ฅธ ์•ก์„ธ์Šค ๋ฒ„ํŠผ์„ ์ฐพ์•„์„œ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ์ฐฝ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.



a04424ad2c06782ab47e5a67ee91766dc28df1ecd7acc7cbbf10dbc353d0d221e1d1a67684e661d1d89ded912711



a04424ad2c06782ab47e5a67ee9f34337ed1877f0a4e7bc0f99d87


๋จผ์ € ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.ย ย 


a04424ad2c06782ab47e5a67ee91766dc28df1ecd7acc7cbbf10dbc353d5d521fededab16bd77d50d9268f356dcd



๊ทธ ๋‹ค์Œ์œผ๋กœ ์ขŒ์ธก์— API ๋ฐ ์„œ๋น„์Šค ํƒญ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ด๋™ํ•œ ๋’ค, Google Sheets API๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์‚ฌ์šฉ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์‚ฌ์šฉ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ๋’ค์— API ๋ฐ ์„œ๋น„์Šค > ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.


a04424ad2c06782ab47e5a67ee91766dc28df1ecd7acc7ccbf11d3c052d3df21a0961e1df0d5ce149b1d25b24df6

์ƒ๋‹จ์˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•˜๊ณ  APIํ‚ค๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‚˜์˜ค๋Š” ๋ฌธ์ž์—ด์„ ๋ฉ”๋ชจ์žฅ์— ๋ณต์‚ฌํ•ด๋‘๋ฉด ๋ฉ๋‹ˆ๋‹ค.ย 


๋‹ค์Œ์€ ๊ตฌ๊ธ€ ์‹œํŠธ ์œ„์ชฝ์˜ URL์„ ๋ณด์‹œ๋ฉด

a04424ad2c06782ab47e5a67ee91766dc28df1ecd7acc7ccbf11d3c75ad2d421f9969eb01ded16442425726cd3ย  ย  ย  ย  ย  ย  ย ์—ฌ๊ธฐ ๋นˆ ๊ณต๋ฐฑ ๋ถ€๋ถ„ย  ย  ย  ย  ย  ย  ย  ย  ย  ย ย a04424ad2c06782ab47e5a67ee91766dc28df1ecd7acc7ccbf11d3c75ad4d221348f105d90220ef6bfe1431e


์œ„ ๋งํฌ ์‚ฌ์ง„์˜ ๊ณต๋ฐฑ ๋ถ€๋ถ„์ด ์ด ์‹œํŠธ์˜ ๊ณ ์œ  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์€ ๋„‰๋„‰ํ•˜๊ฒŒ ์žก์€ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ด์‹ญ์‹œ์˜ค.
ย  ย  ย  ย  ย  ย  ย  ย  string url = $"https://sheets.googleapis.com/v4/spreadsheets/{SHEET_ID}/values/{sheetName}!A1:Z1000?key={API_KEY}";
ย  ย  ย  ย  ย  ย  ย  ย 
ย  ย  ย  ย  ย  ย  ย  ย  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 ํŒŒ์ผ๋กœ ์ฆ‰์‹œ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.


a04424ad2c06782ab47e5a67ee91766dc28df1ecd7acc7ccbf11d2c35cd4d32193581f86d89bedc7400e2fe17a4d



ํ•ด๋‹น ๊ณผ์ •์œผ๋กœ ์ด์ œ ์‹œํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ ๊ท€์ฐฎ์€ ๊ณผ์ •์„ ๋Œ€ํญ ์ค„์˜€์Šต๋‹ˆ๋‹ค.



*๋‹ค์Œ ๋‚ด์šฉ์€ ๋‹ค์Œ ๊ธ€์—