UNITY/PROJECT

[๊ตฌํ˜„] json ์ด์šฉ ์œ ๋‹ˆํ‹ฐ ๋‚ด ๋Œ€ํ™” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ 2

ozllzL 2021. 12. 7. 18:45

์ธ๋„ค์ผ์šฉ

1. json ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

์šฐ๋ฆฌ ๊ฒŒ์ž„์—์„œ๋Š” ์–ธ์–ด ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ์—์„œ ๋ถˆ๋Ÿฌ์™”๋‹ค.

์˜์–ด์™€ ํ•œ๊ตญ์–ด, ์ด 2๊ฐœ๊ตญ์–ด๋ฅผ ์„œ๋น„์Šค ํ•˜๊ณ  ์žˆ๋‹ค.

public class LanguageSaver : MonoBehaviour
{
    ...
    
    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        ...
        if(SceneManager.GetActiveScene().buildIndex != 0)
        {
            DatabaseManager dbManager = FindObjectOfType<DatabaseManager>();
            DialogueParser theParser = FindObjectOfType<DialogueParser>();//parser์„ ์–ธ
            Dialogue[] dialogues;
            
            if (languageIndex == 0)
            {
                dbManager.en = false;
            }
            else if (languageIndex == 1)
            {
                dbManager.en = true;
            }
            
            if (dbManager.en)
                dialogues = theParser.Parse("Dialogue_EN");
            else
                dialogues = theParser.Parse("Dialogue_KR");
            for (int i = 0; i < dialogues.Length; i++)
            {
                dbManager.dialogueDic.Add(i, dialogues[i]);
            }
        }
    }

    ...
}

์ด ์ฝ”๋“œ๋Š” DontDestroyOnLoad๋กœ ๋˜์–ด์žˆ์–ด์„œ ํ•œ๋ฒˆ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๋ฉด ๊ณ„์† ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋‹ค.

DatabaseManager๋ผ๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ en์ด๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ true๋ฉด ์˜์–ด, flase๋ฉด ํ•œ๊ตญ์–ด๋กœ ํ•ด๋†“์•˜๋‹ค.

(๋ณด๊ธฐ ๋ถˆํŽธํ•˜๊ฒŒ ์™œ๊ทธ๋žฌ์ง€...)

(์ด ๋ณ€์ˆ˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์œ„์น˜๋Š” ์‹ ๊ฒฝ ์“ธ ํ•„์š” ์—†๊ณ  ์–ด๋””์— ์žˆ๋˜ ๋Œ€ํ™” ์–ธ์–ด ์ข…๋ฅ˜ ๋ณ€์ˆ˜์ด๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.)

DialogueParser๋ผ๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ Parseํ•จ์ˆ˜์— ํ•ด๋‹น ์–ธ์–ด๋ผ๋ฉด ๋ถˆ๋Ÿฌ์™€์•ผ ํ•˜๋Š” jsonํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋„ฃ์–ด์ค€๋‹ค.

(์˜์–ด๋ฒ„์ „์€ Dialogue_EN.json, ํ•œ๊ตญ์–ด๋ฒ„์ „์€ Dialogue_KR.json์ด๋‹ค)

๊ทธ๋ ค๋ฉด theParser.Parse๋Š” ํ•ด๋‹น ์–ธ์–ด์˜ ๋ชจ๋“  ๋Œ€ํ™” ๋‚ด์šฉ์˜ Dialogue(์ด๋ฆ„, ํ•ด๋‹น ์ด๋ฆ„์˜ ๋Œ€ํ™”๋‚ด์šฉ ๋ฆฌ์ŠคํŠธ) ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

Dialogue๋Š” ๋Œ€ํ™” ์ƒ๋Œ€์™€ ์ด ์ƒ๋Œ€์™€ ๋‚˜๋ˆŒ ๋Œ€ํ™” ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์ด๋‹ค.

public class Dialogue
{
    public string name;
    public string[] contexts;
}

๊ฐ„๋‹จํ•˜๊ฒŒ DialogueParser๋กœ ๋Œ€์‚ฌ ๋‚ด์šฉ์„ ๋ฐ›์•„์™€์„œ DatabaseManager๋กœ ๋นผ๋‹ค ์“ด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

2. DialogueParser : jsonํŒŒ์ผ ๋ฐฐ์—ด๋งŒ๋“ค๊ธฐ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.IO;

public class DialogueParser : MonoBehaviour
{
    public Dialogue[] Parse(string _FileName)
    {
        List<Dialogue> dialogueList = new List<Dialogue>();//๋Œ€์‚ฌ ๋ฆฌ์ŠคํŠธ 
        TextAsset dialogueString = Resources.Load<TextAsset>(_FileName);
        JsonData dialogueData = JsonMapper.ToObject(dialogueString.ToString());

        for (int i = 0; i < dialogueData.Count;i++)
        {
            Dialogue dialogue = new Dialogue();
            dialogue.name = dialogueData[i]["name"].ToString();
            List<string> contextList = new List<string>();
            for(int j = 0; j < dialogueData[i]["lines"].Count; j++)
            {
                contextList.Add(dialogueData[i]["lines"][j]["line"].ToString());
            }
            dialogue.contexts = contextList.ToArray();
            dialogueList.Add(dialogue);
        }
        return dialogueList.ToArray();//๊ฐ ์บ๋ฆญํ„ฐ์˜ ๋Œ€์‚ฌ๋“ค ๋ฐฐ์—ด๋กœ ๋ฆฌํ„ด
    }
}

๋”ฐ๋ผ ์ฝ์–ด๋ณด๋ฉด ์„ค๋ช… ์—†์ด ์ถฉ๋ถ„ํžˆ ์ดํ•ด ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค!

FileName์€ ์•„๊นŒ ๋ฐ›์€ Dialogue_EN, Dialogue_KR ์ด๊ฑฐ๋‹ค.

 

LitJson์„ ์‚ฌ์šฉํ–ˆ๋‹ค. Unity์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” JsonUtility์™€ ๋น„์Šทํ•œ ๊ฒƒ์ธ๋ฐ

๋‚˜์ค‘์— ์„ค๋ช…ํ•  ๊ธฐํšŒ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์„ค๋ช…ํ•  ๊ฒƒ์ด๋‹ค. ์ผ๋‹จ ๊ถ๊ธˆํ•˜๋ฉด ๊ตฌ๊ธ€๋ง ํ•ด๋ณด์„ธ์—ฌ

 

JsonData๋กœ ๋ฐ›์€ ๋ฐฐ์—ด์„ ํ•˜๋‚˜์”ฉ ๋œฏ์–ด ๋Œ€ํ™”๋ณ„(๋งˆ๋””๋ณ„ XX ๋งˆ๋””๋Š” List<string>์œผ๋กœ ๋ฌถ์–ด๋ฒ„๋ฆฐ๋‹ค.)๋กœ List<Dialogue>ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

3. DatabaseManager : index๋กœ ๋Œ€์‚ฌ ์กฐํšŒ

public class DatabaseManager : MonoBehaviour
{
    public bool en = false;//์˜์–ด ์—ฌ๋ถ€
    public Dictionary<int, Dialogue> dialogueDic = new Dictionary<int, Dialogue>();

    ...

    public string GetDialogue(int id, int index)
    {
        if (index == dialogueDic[id - 1].contexts.Length)
            return null;
        else
            return dialogueDic[id - 1].contexts[index];
    }
}

์œ„์—์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฐฐ์—ด์„ index๋กœ ์กฐํšŒ ๋”ฑ ๋˜๊ฒŒ index, Dialgoueํ˜•ํƒœ์˜ Dictionary์— ์ตœ์ข… ์ €์žฅํ•ด์ค€๋‹ค.

(์ฝ”๋“œ ๋ถ„๋ฆฌ, ์กฐํšŒ ํŽธ๋ฆฌ์„ฑ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ํ–ˆ์ง€๋งŒ ์ € ์œ„ ์ฝ”๋“œ์—์„œ ๋ฐ”๋กœ Dictionary์— ๊ฝ‚๋˜์ง€ ํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™๊ธด ํ•˜๋‹ค.)

 

์ด์ œ GetDialogue๋กœ (์—ฌ๊ธฐ์„œ id๊ฐ€ jsonํŒŒ์ผ index๋ฅผ ์˜๋ฏธํ•˜๊ณ  index๋Š” ์ด ๋Œ€ํ™” ๋ช‡๋ฒˆ ์งธ ๋งˆ๋””์ธ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค ์—ฌ๊ธฐ์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๋˜ ์„ž์˜€๊ตฐ...ใ… ใ… ) ๋ช‡ ๋ฒˆ์งธ ๋Œ€ํ™”(id)์˜ ๋ช‡ ๋ฒˆ์งธ ๋งˆ๋””(index)์ธ์ง€ ๋”ฑ ๋”ฑ ์ˆซ์ž ๋„ฃ์–ด์„œ ๋”ฑ ๋ถˆ๋Ÿฌ์ฃผ๋ฉด ๋์ด๋‹ค!

 

์ด ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์œผ๋กœ ๋„˜๊ธฐ๊ฒ ๋‹ค... ๊ตฌ๋Ÿผ ์•ˆ๋…•

 

 

๊ทธ๋ฆฌ๊ณ  ์ด๊ฑฐ ์ฒ˜์Œ ๊ตฌํ˜„ํ•  ๋•Œ ์ด ์˜์ƒ์„ ๋งŽ์ด ์ฐธ๊ณ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๋‚˜ํ•œํ…Œ ํ•„์š” ์—†๋Š” ๊ธฐ๋Šฅ ๋นผ๊ณ  ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ

๋ชป ์•Œ์•„๋ณผ ์ •๋„๋กœ ์ฝ”๋“œ๊ฐ€ ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•ด์ง€๊ณ  ๋งŽ์ด ๋ฐ”๋€Œ๊ธด ํ–ˆ๋‹ค.

https://www.youtube.com/watch?v=N4fudqV49TU