구글 스프레드 시트를 유니티에 연동하여 데이터를 읽어올 수 있습니다. 실제로 스크립트를 이용하여 유니티에서 데이터를 받아오고 이를 활용합니다.
💬 목차
1. [유니티] 구글 스프레드 시트(엑셀) 연동 1 - 가입
2. [유니티] 구글 스프레드 시트(엑셀) 연동 2 - 유니티 연결
[📌현재 글] 3. [유니티] 구글 스프레드 시트(엑셀) 연동 3 - 데이터 가져오기
✅ 구현(스크립트 작성)
· 엑셀 시트
- 아이템 설명을 관리하는 데이터시트를 읽어 게임에 적용하여 사용해보도록 하겠습니다.
· 스크립트
using UnityEngine;
public abstract class DataReaderBase : ScriptableObject
{
[Header("시트의 주소")][SerializeField] public string associatedSheet = "";
[Header("스프레드 시트의 시트 이름")][SerializeField] public string associatedWorksheet = "";
[Header("읽기 시작할 행 번호")][SerializeField] public int START_ROW_LENGTH = 2;
[Header("읽을 마지막 행 번호")][SerializeField] public int END_ROW_LENGTH = -1;
}
- 스프레드 시트로 읽어올 여러 데이터에 기본이 되는 읽기형식에 대해 정의한 추상클래스입니다.
[Header("시트의 주소")][SerializeField] public string associatedSheet = "";
- 시트의 주소를 연결합니다.
- 아래의 이미지처럼 드래그한 영역 /d/ ~ /edit# 범위 내인 '~' 영역을 지정하면 됩니다.
- '1hAEhskFqhVJhzuly7l1c6xTNfdz0m3filSbBDMC6nRk'가 들어갈 값입니다.
[Header("스프레드 시트의 시트 이름")][SerializeField] public string associatedWorksheet = "";
- 시트의 워크시트를 연결합니다.
[Header("읽기 시작할 행 번호")][SerializeField] public int START_ROW_LENGTH = 2;
[Header("읽을 마지막 행 번호")][SerializeField] public int END_ROW_LENGTH = -1;
- 워크시트에서 읽기 시작할 행 번호와 읽기를 마칠 끝 행 번호를 설정합니다.
using UnityEngine;
using GoogleSheetsToUnity;
using System.Collections.Generic;
using System;
using UnityEngine.Events;
#if UNITY_EDITOR
using UnityEditor;
#endif
[Serializable]
public struct ItemData
{
public EntityCode id;
public string name;
[TextArea] public string description;
public ItemData(EntityCode id, string name, string description)
{
this.id = id;
this.name = name;
this.description = description;
}
}
[CreateAssetMenu(fileName = "Reader", menuName = "Scriptable Object/ItemDataReader", order = int.MaxValue)]
public class ItemDataReader : DataReaderBase
{
[Header("스프레드시트에서 읽혀져 직렬화 된 오브젝트")][SerializeField] public List<ItemData> DataList = new List<ItemData>();
internal void UpdateStats(List<GSTU_Cell> list, int itemID)
{
EntityCode id = EntityCode.NULL;
string name = null, description = null;
for (int i = 0; i < list.Count; i++)
{
switch (list[i].columnId)
{
case "id":
{
id = (EntityCode)int.Parse(list[i].value);
break;
}
case "name":
{
name = list[i].value;
break;
}
case "description":
{
description = list[i].value;
break;
}
}
}
DataList.Add(new ItemData(id, name, description));
}
}
#if UNITY_EDITOR
[CustomEditor(typeof(ItemDataReader))]
public class ItemDataReaderEditor : Editor
{
ItemDataReader data;
void OnEnable()
{
data = (ItemDataReader)target;
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
GUILayout.Label("\n\n스프레드 시트 읽어오기");
if (GUILayout.Button("데이터 읽기(API 호출)"))
{
UpdateStats(UpdateMethodOne);
data.DataList.Clear();
}
}
void UpdateStats(UnityAction<GstuSpreadSheet> callback, bool mergedCells = false)
{
SpreadsheetManager.Read(new GSTU_Search(data.associatedSheet, data.associatedWorksheet), callback, mergedCells);
}
void UpdateMethodOne(GstuSpreadSheet ss)
{
for (int i = data.START_ROW_LENGTH; i <= data.END_ROW_LENGTH; ++i)
{
data.UpdateStats(ss.rows[i], i);
}
EditorUtility.SetDirty(target);
}
}
#endif
- 이 스크립트 자체를 복사하여 사용할 수 있습니다. DataReaderBase 추상 클래스또한 함께 복사하여 사용하세요.
[Serializable]
public struct ItemData
{
public EntityCode id;
public string name;
[TextArea] public string description;
public ItemData(EntityCode id, string name, string description)
{
this.id = id;
this.name = name;
this.description = description;
}
}
- id와, name, description을 사용하는 구조체를 선언하였습니다.
- EntityCode는 아이템코드를 열거형으로 표현한 것입니다. (복사하여 사용할때는 int로 해도 상관 없습니다.)
[CreateAssetMenu(fileName = "Reader", menuName = "Scriptable Object/ItemDataReader", order = int.MaxValue)]
- 스크립터블 오브젝트를 생성하기위한 UI를 등록합니다.
[Header("스프레드시트에서 읽혀져 직렬화 된 오브젝트")][SerializeField] public List<ItemData> DataList = new List<ItemData>();
- 시트에서 데이터를 읽으면 이 리스트에 저장됩니다.
internal void UpdateStats(List<GSTU_Cell> list, int itemID)
{
EntityCode id = EntityCode.NULL;
string name = null, description = null;
for (int i = 0; i < list.Count; i++)
{
switch (list[i].columnId)
{
case "id":
{
id = (EntityCode)int.Parse(list[i].value);
break;
}
case "name":
{
name = list[i].value;
break;
}
case "description":
{
description = list[i].value;
break;
}
}
}
DataList.Add(new ItemData(id, name, description));
}
- 가장 핵심이 되는 코드로, 각 행을 읽을때마다 데이터를 저장하기위해 구조체를 생성하고, 리스트에 삽입합니다.
- case "id"는 스프레드 시트의 열이름이 되며, 해당 열 이름이 "id"인경우 구조체의 id의 변수에 삽입되도록 하는 구조입니다.
· 설정 요약
- 위 그림과 같이 설정합니다.
✅ 결과
- 위 그림처럼 데이터 읽기를 누르면 우측과같이 데이터가 읽어져 Data List에 삽입됩니다.
- 이 값들을 다른 기능에서 읽어서 사용할 수 있습니다.
'unity game modules' 카테고리의 다른 글
[유니티] 검기 이펙트, VFX 관리 (0) | 2023.03.07 |
---|---|
[유니티] 발소리 구현 (2) | 2023.03.04 |
[유니티] 구글 스프레드 시트(엑셀) 연동 2 - 유니티 연결 (0) | 2023.03.02 |
[유니티] 구글 스프레드 시트(엑셀) 연동 1 - 가입 (1) | 2023.03.02 |
[유니티] 다이얼로그박스 시스템 (스크립트로 만드는 다이얼로그박스) (0) | 2023.02.10 |