현재 NPC 별로 dialogue를 매핑하기 위해 xml 데이터를 사용하고 있다. 본 포스트에서는 이전 포스트에서 저장한 xml 데이터를 어떻게 읽어오고, 게임 내에서는 어떻게 관리하는지에 대해 정리한다.
우선 Resources 폴더에서 xml 파일을 읽은 후 사용할 것이기에 이전 시간에 만든 xml 파일을 Resources/Data에 저장한다.

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();
}
다음으로 게임이 시작될 때 해당 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하면 된다.