유니티 xml 데이터 접근

이도희·2023년 1월 5일

Unity 정리

목록 보기
2/5

현재 NPC 별로 dialogue를 매핑하기 위해 xml 데이터를 사용하고 있다. 본 포스트에서는 이전 포스트에서 저장한 xml 데이터를 어떻게 읽어오고, 게임 내에서는 어떻게 관리하는지에 대해 정리한다.

1. xml 파일 폴더에 넣기

우선 Resources 폴더에서 xml 파일을 읽은 후 사용할 것이기에 이전 시간에 만든 xml 파일을 Resources/Data에 저장한다.

2. Dialogue Data Class 작성하기

Basic Dialogue의 각 column 값을 attribute로 정의한다. 각 데이터별 Loader를 정의한다. 여기서 DataLoader는 xml에서 읽어온 데이터를 딕셔너리 형태로 저장한 다음 반환해준다. XmlRoot와 XmlElement는 각각 저번 시간에 작성한 schema를 토대로 본인의 데이터에 맞게 작성한다.

MakeDict의 경우 각 데이터 별로 해당되는 key를 설정해주면 된다. 현재는 일반적으로 NPC와 소통할 때 나오는 dialogue를 저장한 데이터라서 각 npc 이름을 key로 받는다고 가정하고 작성하였다.

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
// 각 column에 해당하는 데이터 작성
public class DialogueData
{
    [XmlAttribute]
	public int id;
    [XmlAttribute]
	public string npc;
	[XmlAttribute]
	public string kor;
	[XmlAttribute]
	public string eng;
}
// 데이터에 맞는 key값 설정한 Dictionary 작성 
[Serializable, XmlRoot("BasicDialogue")]
public class DialogueDataLoader : ILoader<string, DialogueData>
{
	[XmlElement("DialogueData")]
	public List<DialogueData> dialogueData = new List<DialogueData>();

	public Dictionary<string, DialogueData> MakeDict()
	{
		Dictionary<string, DialogueData> dict = new Dictionary<string, DialogueData>();

		foreach (DialogueData dialogue in dialogueData)
			dict.Add(dialogue.npc, dialogue);

		return dict;
	}
}

여기서 ILoader는 인터페이스로 다음의 형태를 띄고있다.

public interface ILoader<Key, Item>
{
    Dictionary<Key, Item> MakeDict();
}

3. Data Manager Class 작성하기

다음으로 게임이 시작될 때 해당 xml을 읽어오는 코드를 작성한다. LoadXml 함수를 통해 해당되는 딕셔너리 결과를 저장한다. (여기서는 BasicDialogue.xml 파일을 읽은 후 npc name : data 형태의 dictionary를 저장하고 있다.)

GetBasicDialogue 함수는 npc 이름을 받았을 때 데이터가 존재하면 해당되는 결과를 넘겨주게 된다. npc가 한 대화만 말하기 보다는 여러 대화 중 랜덤으로 한 가지 대화를 보여주는게 좋을 것 같아서 대화 데이터 column안에 여러 대화를 작성하였다. 그리고 읽어올때 ,를 기준으로 대화를 잘라서 바로 저장하고자 한다.

 public class DataManager : MonoBehaviour
{
    public static DataManager instance = null;
    public Dictionary<string, DialogueData> Dialogues { get; private set; }

    void Awake()
    {
        instance = this;
        Dialogues = LoadXml<DialogueDataLoader, string, DialogueData>("BasicDialogue").MakeDict();
    }

    private Loader LoadXml<Loader, Key, Item>(string name) where Loader : ILoader<Key, Item>, new()
    {
        XmlSerializer xs = new XmlSerializer(typeof(Loader));
        TextAsset textAsset = Resources.Load<TextAsset>("Data/" + name);
        using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(textAsset.text)))
            return (Loader)xs.Deserialize(stream);
    }

    public string[] GetBasicDialogue(string npcName)
    {
        if (Dialogues.TryGetValue(npcName, out DialogueData value) == false)
        {
            return null;
        }

        value.kor.Replace("{userName}", GameManager.instance.name); 
        string[] npcDialogue = value.kor.Split(',');
        return npcDialogue;
    }
}

여기까지 기본적으로 excel로 데이터를 작성한 후 xml로 변환하고 이 xml을 유니티에서 읽어와서 게임 데이터로 사용하는 방법들을 정리하였다. xml 데이터를 아까 말한 , 방식으로 쪼개서 더 다양한 데이터를 넣는다 등 본인의 게임에 맞는 상태로 custom하면 된다.

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글