본문 바로가기
# 게임/# Unity

[Unity] Localization에 관해 #2

by 쁘레레레레레 2022. 7. 21.

그간 좀 바빠서 드디어 업로드를 한다.

 

미드처럼 Previous에 대해 설명하자면

 

엑셀로 데이터 테이블을 만든 후 csv로 저장 후 유니티로 가져와 띄우는걸 해볼것이다.

 

 

인코딩 관련한 이슈가 있다.  그래서 kr과 ua관련 텍스트가 싹 날아갔다...

 

아무튼 대충 텍스트를 채웠다.

 

근데... 어.. 한글이 꺠져서 나왔다. csv파일엔 정상인데

 

결국 csv파일을 메모장으로 열어서 다른이름으로 저장을 누른 후 인코딩 형식을 utf-8로 "다시" 해줬다.

 

그리고 난 후...

 

다음과 같이 성공!

 

코드는 아래와 같다.

 

CSVLoader.cs


public enum ENUM_TYPE_ID
{
    Key,
    Id,
    SharedComments,
    en,
    kr,
    ua,
    es
}

public class CSVLoader : MonoBehaviour
{
    string strPath;
    string strFileName;

    public string strTestFileName;

    public Dictionary<string, List<string>> savedData;

    private void Start()
    {
        savedData = new Dictionary<string, List<string>>();
        Load(strTestFileName);

        GameObject.Find("GameManager").GetComponent<GameManager>().Load_Done();
    }

    void Load(string __fileName__)
    {
        strPath = Application.dataPath + "/" + __fileName__;
        Debug.Log("Path : " + strPath);

        StreamReader sr = new StreamReader(strPath);

        string line = string.Empty;
        while ((line = sr.ReadLine()) != null)
        {
            //Debug.Log("line Data : " + line);
            if (line == "Key,Id,SharedComments,en,kr,ua,es")
            {
                splitBySymbol(line.Split(','), savedData, true);
            }
            else
            {
                splitBySymbol(line.Split(','), savedData);
            }
        }
        sr.Close();
    }

    void Save(string __fileName) // 필요시 구현
    {
        StreamWriter sr = new StreamWriter(strPath);
    }

    void splitBySymbol(string[] strData, Dictionary<string, List<string>> dataContainer, bool isFirst = false)
    {
        if (isFirst)
        {
            for (int i = 0; i < strData.Length; i++)
            {
                dataContainer.Add(strData[i], new List<string>());
            }
        }
        else
        {
            dataContainer[ENUM_TYPE_ID.Key.ToString()].Add(strData[0]);
            dataContainer[ENUM_TYPE_ID.Id.ToString()].Add(strData[1]);
            dataContainer[ENUM_TYPE_ID.SharedComments.ToString()].Add(strData[2]);
            dataContainer[ENUM_TYPE_ID.en.ToString()].Add(strData[3]);
            dataContainer[ENUM_TYPE_ID.kr.ToString()].Add(strData[4]);
            dataContainer[ENUM_TYPE_ID.ua.ToString()].Add(strData[5]);
            dataContainer[ENUM_TYPE_ID.es.ToString()].Add(strData[6]);
        }
    }
}

 

 

DialogTest.cs

public class DialogTest : MonoBehaviour
{
    public TMP_Text dialog;
    CSVLoader go;

    public int currentChannel = 0;

    Button btn_en;
    Button btn_kr;
    Button btn_ua;
    Button btn_es;
    private void Start()
    {
        btn_en = GameObject.Find("en").GetComponent<Button>();
        btn_kr = GameObject.Find("kr").GetComponent<Button>();
        btn_ua = GameObject.Find("ua").GetComponent<Button>();
        btn_es = GameObject.Find("es").GetComponent<Button>();

        initFunction();

        btn_en.onClick.AddListener(delegate { translateToAnotherLanguage("en"); });
        btn_kr.onClick.AddListener(delegate { translateToAnotherLanguage("kr"); });
        btn_ua.onClick.AddListener(delegate { translateToAnotherLanguage("ua"); });
        btn_es.onClick.AddListener(delegate { translateToAnotherLanguage("es"); });
    }

    public void initFunction()
    {
        go = GameObject.FindGameObjectWithTag("CSVLoader").GetComponent<CSVLoader>();
        dialog = GameObject.Find("txtBox").GetComponentInChildren<TMP_Text>();

        dialog.text = go.savedData[ENUM_TYPE_ID.en.ToString()][currentChannel];
    }


    public void translateToAnotherLanguage(string countryCode)
    {
        switch (countryCode)
        {
            case "en":
                dialog.text = go.savedData[ENUM_TYPE_ID.en.ToString()][currentChannel];
                break;
            case "kr":
                dialog.text = go.savedData[ENUM_TYPE_ID.kr.ToString()][currentChannel];
                break;
            case "ua":
                dialog.text = go.savedData[ENUM_TYPE_ID.ua.ToString()][currentChannel];
                break;
            case "es":
                dialog.text = go.savedData[ENUM_TYPE_ID.es.ToString()][currentChannel];
                break;

            default:
                Debug.Log("you need to write down the correct word");
                break;

        }
    }

    public void changeChannel(int nChannel)
    {
        currentChannel = nChannel;
    }

}