본문 바로가기

Unity 공부시작

유니티 :: Dictionary에 TextAsset을 이용하여 텍스트 파일 읽어오기

준비물 ) 


- Resources 폴더에 들어있는 text 파일 ( UTF-8로 인코딩 되어있어야 한다 )



직업    렙    체력    마나

----------------------------

<text 내용>

전사    1    1000    50

전사    2    1200    60

전사    3    1400    70

전사    4    1600    80

전사    5    1800    90

전사    6    2000    100


각 단어들 간의 간격은 '\t' 로 일정하다.  위의 데이터들을 아래와 같은 Dictionary에 넣어보려 한다.


Dictionary<string, Dictionary<int, StatData>>();


StatData는 class로, hp와 mp를 멤버변수로 가지고 있다.


public class test : MonoBehaviour
{
    Dictionary<string, Dictionary<int, StatData>> DicDatas;
    // Start is called before the first frame update
    void Start()
    {
        DicDatas = new Dictionary<string, Dictionary<int, StatData>>();

        TextAsset textAsset = Resources.Load<TextAsset>("Datas");
        string[] lines = textAsset.text.Split('\n');

        foreach(string line in lines)
        {
            string[] words = line.Split('\t');
            
            // 키를 가지고 있지 않다면
            if(!DicDatas.ContainsKey(words[0]))
            {
                DicDatas.Add(words[0], new Dictionary<int, StatData>());
            }
            DicDatas[words[0]].Add(int.Parse(words[1]), new StatData(int.Parse(words[2]), int.Parse(words[3])));
        }

        Debug.Log("전사 랩 2 체력 : " + DicDatas["전사"][2].hp);
    }
}
public class StatData
{
    public int hp, mp;

    public StatData(int _hp, int _mp)
    {
        this.hp = _hp;
        this.mp = _mp;
    }
}

TextAsset.Resources.Load<TextAsset>("파일명") 을 이용하여 TextAsset에 text파일을 담아둘 수 있다.


이 후에 string 배열에 '\n', 즉 엔터를 기준으로 string들을 담는다. 여기에 사용되는 함수는 textAsset.text.Split("'\n'"); 이다.


각 줄마다 foreach를 돌면서 다시 string 배열에 '\t'를 기준으로 잘라주면, 여러 개가 합쳐져 있던 정보들이 한 개씩 잘라진다.


한 개씩 자르는데 사용한 함수는 string.Split('\t'); 이다.


DicDatas.ContainsKey("값") 은 '값'에 해당하는 Key가 존재하는 지 bool형을 return 해주는 함수이다.


텍스트 내용에서 "전사"가 key가 될 것이므로, Dictionary에 "전사"라는 key를 담아주어야 한다.


따라서 "전사" 키가 존재하지 않는다면 생성해주기 위해 Dictionary.ContainsKey()를 이용한 것이다.


"전사" 키를 생성해 주었다면 words 배열에 각각 저장된 정보들을 Dictionary.Add() 해주면 된다.


값을 출력하기 위해서는, 위와 같은경우 먼저 첫 번째 string이 키가 되고 이 string 키에 맞는 Dictionary 중 첫 번째 int가 key가 되므로,


DicDatas["전사"][2].hp 와 같이 접근해야 한다.