본문 바로가기
유니티

Day 56 - Unity와 구글 시트 데이터 동기화 전략

by shin0707 2024. 12. 13.
728x90

 

  • 주제

>>  데이터 동기화란?

>>  동기화를 위한 기본 로직

>>  Unity와 구글 시트 동기화 코드 예제

>>  동기화 자동화: 주기적 업데이트

>>  동기화 상태 표시

 


  • 공부내용

Unity와 구글 시트를 연동해 데이터를 주고받는 과정에서 가장 중요한 부분 중 하나는 데이터 동기화다.

동기화를 통해 데이터 불일치를 방지하고, 실시간으로 최신 데이터를 유지할 수 있다.

이번 글에서는 효율적인 동기화 전략과 구현 방식을 살펴보자.

 

1. 데이터 동기화란?

데이터 동기화는 다음과 같은 작업을 포함한다:

  • 데이터 불러오기: 구글 시트에서 데이터를 Unity로 가져오기.
  • 데이터 업데이트: Unity에서 데이터를 수정하고 이를 다시 구글 시트에 반영.
  • 자동 동기화: 특정 이벤트나 주기에 따라 데이터 동기화 수행.

 

2. 동기화를 위한 기본 로직

서버 간 트래픽을 고르게 분배하기 위해 로드 밸런서를 사용한다.

Unity에서 구글 시트와 동기화를 구현하기 위해, 아래의 단계를 따른다:

  1. 구글 시트에서 최신 데이터를 불러온다.
  2. Unity에서 수정된 데이터를 구글 시트로 전송한다.
  3. 필요한 경우, 데이터 동기화 상태를 UI에 표시한다.

 

3. Unity와 구글 시트 동기화 코드 예제

아래는 Unity에서 자동으로 데이터를 동기화하는 스크립트다.

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class DataSynchronizer : MonoBehaviour
{
    private string sheetUrl = "https://script.google.com/macros/s/your-deployed-url/exec";

    public void SyncData()
    {
        StartCoroutine(SyncCoroutine());
    }

    private IEnumerator SyncCoroutine()
    {
        // 1. 구글 시트에서 최신 데이터 가져오기
        UnityWebRequest loadRequest = UnityWebRequest.Get($"{sheetUrl}?action=load");
        yield return loadRequest.SendWebRequest();

        if (loadRequest.result == UnityWebRequest.Result.Success)
        {
            Debug.Log($"Data Loaded: {loadRequest.downloadHandler.text}");
            // 불러온 데이터를 처리
            GoogleDataList dataList = JsonUtility.FromJson<GoogleDataList>(loadRequest.downloadHandler.text);

            // 2. Unity에서 데이터 업데이트
            UpdateLocalData(dataList);

            // 3. 업데이트된 데이터를 구글 시트로 다시 전송
            StartCoroutine(UpdateGoogleSheet(dataList));
        }
        else
        {
            Debug.LogError($"Failed to load data: {loadRequest.error}");
        }
    }

    private void UpdateLocalData(GoogleDataList dataList)
    {
        foreach (var data in dataList.data)
        {
            Debug.Log($"Updating Local Data - Name: {data.name}, Score: {data.score}");
        }
    }

    private IEnumerator UpdateGoogleSheet(GoogleDataList dataList)
    {
        var names = new System.Text.StringBuilder();
        var scores = new System.Text.StringBuilder();

        foreach (var data in dataList.data)
        {
            names.Append($"{data.name},");
            scores.Append($"{data.score},");
        }

        string updateUrl = $"{sheetUrl}?action=overwrite&names={UnityWebRequest.EscapeURL(names.ToString())}&scores={UnityWebRequest.EscapeURL(scores.ToString())}";

        UnityWebRequest updateRequest = UnityWebRequest.Get(updateUrl);
        yield return updateRequest.SendWebRequest();

        if (updateRequest.result == UnityWebRequest.Result.Success)
        {
            Debug.Log($"Data Updated Successfully: {updateRequest.downloadHandler.text}");
        }
        else
        {
            Debug.LogError($"Failed to update data: {updateRequest.error}");
        }
    }
}

 


 

4. 동기화 자동화: 주기적 업데이트

데이터 동기화를 자동화하려면 일정 시간마다 동기화를 수행하도록 설정한다.

InvokeRepeating을 활용한 예제는 다음과 같다:

private void Start()
{
    InvokeRepeating(nameof(SyncData), 0, 60f); // 60초마다 동기화
}

 


 

5. 동기화 상태 표시

Unity UI에 동기화 상태를 표시하면 사용자가 진행 상황을 알 수 있다.

아래는 간단한 로딩 애니메이션을 추가하는 코드다:

using TMPro;
using UnityEngine;

public class SyncStatusUI : MonoBehaviour
{
    public TextMeshProUGUI statusText;

    public void ShowStatus(string message)
    {
        statusText.text = message;
    }
}

 

 

SyncCoroutine() 내에서 상태를 업데이트:

statusText.ShowStatus("Loading data...");
yield return loadRequest.SendWebRequest();
statusText.ShowStatus("Updating local data...");

이번 글에서는 Unity와 구글 시트를 동기화하는 전략을 다뤘다.

다음 글에서는, 구글 시트와 연동한 프로젝트에서 성능을 최적화하는 방법을 다음 글에서 소개할 예정이다.

728x90
반응형