본문 바로가기
🌐 유니티 (Unity)

Day 44 - 구글 스프레드시트와 유니티 연동 및 다국어 데이터 관리 (2부)

by shin0707 2024. 12. 7.
728x90

  • 주제

>>  CSV 데이터 처리

>>  딕셔너리 데이터 불러오기

>>  UI 연동


  • 공부내용

이전 게시글(Day 43)에서는 LocalizingManager 클래스와 언어 설정(Enum)을 설명했다.

이번 게시글에서는 CSV 데이터를 구글 스프레드시트에서 가져와 처리하는 방식과 UI에 적용하는 과정을 다룬다.

 

1. CSV 데이터 처리

구글 스프레드시트의 데이터를 UnityWebRequest로 가져오면, CSV 형식의 텍스트가 반환된다.

이 텍스트를 줄 단위로 분리하고, 각 열을 키(Key)와 값(Value)로 매칭해 딕셔너리(Dictionary)에 저장한다.

이를 위해 정규 표현식을 활용한다.

private IEnumerator LoadLocalizedTextCoroutine(string url, ELanguage eLanguage)
{
    localizedText = new Dictionary<string, string>();
    UnityWebRequest www = UnityWebRequest.Get(url);     
    yield return www.SendWebRequest();

    if (www.result != UnityWebRequest.Result.ConnectionError && www.result != UnityWebRequest.Result.ProtocolError)
    {
        string data = www.downloadHandler.text; // CSV 데이터를 문자열로 받기
        string[] lines = data.Split('\n'); // 줄 단위로 나누기
        int languageIndex = (int)eLanguage; // 선택된 언어의 열 인덱스

        for (int i = 1; i < lines.Length; i++) // 첫 줄은 헤더이므로 제외
        {
            if (lines[i].Length == 0) continue; // 빈 줄 건너뛰기

            // 정규 표현식으로 CSV의 콤마 구분 (따옴표 내 콤마는 무시)
            string pattern = ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)";
            string[] columns = Regex.Split(lines[i], pattern);

            if (columns.Length > 0)
            {
                string key = columns[0].Trim('"'); // 첫 번째 열: Key
                string value = columns[languageIndex].Trim('"'); // 선택된 언어의 열: Value
                localizedText[key] = value; // 딕셔너리에 저장
            }
        }

        Debug.Log("로컬라이징 데이터 로드 완료");
        IsLocalized = true; // 데이터 로드 상태 갱신
    }
    else
    {
        Debug.LogError("데이터 로딩 실패: " + www.error);
    }
}

2. 딕셔너리 데이터 불러오기

로딩된 데이터를 기반으로, 게임 내에서 특정 키에 해당하는 텍스트 값을 가져올 수 있다.

키가 존재하지 않을 경우, 경고 메시지를 출력한다.

public string GetValue(string key)
{
    if (localizedText.TryGetValue(key, out string value))
    {
        return value; // 해당 키의 값 반환
    }

    Debug.LogWarning($"키 없음: {key}");
    return "Missing"; // 키가 없을 경우 기본값 반환
}

3. UI 연동

UIManager와 같은 별도의 클래스를 활용하여, 로컬라이징 데이터를 UI 텍스트에 적용할 수 있다.

아래는 예제 코드다.

public class UIManager : MonoBehaviour
{
    [Header("로컬라이징 텍스트")]
    public TMPro.TextMeshProUGUI welcomeText; // TextMeshPro UI 텍스트
    
    public void ConvertItemDescText()
    {
        if (LocalizingManager.Instance.IsLocalized)
        {
            welcomeText.text = LocalizingManager.Instance.GetValue("Welcome"); // "Welcome" 키 값 적용
        }
        else
        {
            Debug.LogWarning("로컬라이징 데이터가 로드되지 않았습니다.");
        }
    }
}

 


<정리>

  • Day 43에서 배운 내용
    • 스프레드시트 URL 생성 및 UnityWebRequest로 데이터 로드.
  • Day 44에서 다룬 내용
    • CSV 데이터를 정규 표현식으로 처리하여 딕셔너리에 저장.
    • GetValue 메서드를 통해 텍스트 조회.
    • UIManager와 연동하여 게임 내 UI에 적용.
728x90

loading