XML, JSON 데이터는 구조화된 데이터를 저장하고 전송하는 데 사용되는 데이터 형식입니다.
unity에서는 다양한 게임 프로젝트와 서비스 프로젝트를 개발하는데 다양한 목적을 위해 두 형식의 데이터를 사용하게 됩니다.
XML 데이터 사용 사례
1. 규격이 정해진 데이터 :
xml은 게임의 규칙, 레벨 데이터 또는 캐릭터 속성과 게임의 구성 설정을 저장하는 데 사용될 수 있다.
2. 다양한 언어와 연동 :
xml은 다양한 언어에 대한 번역을 저장하는 현지화 데이터에 사용이 됩니다. 원본 텍스트와 번역된 텍스트가 포함됩니다.
3. 레거시 시스템 :
xml을 사용하는 외부 시스템, api로 작업하게되는 경우 xml 데이터를 분석해서 unity 프로젝트에 통합하여 사용할 수 있습니다.
json 데이터 사용 사례
1. 데이터 직렬화 :
json 데이터는 일반적으로 가볍고 사람이 읽을수 있는 형식으로 직렬화하는데 주로 사용됩니다.
게임 프로젝트안에 복합한 데이터 구조를 가진 데이터를 json 형식으로 직렬화해서 저장하고 로드할 수 있습니다.
2. 웹 API :
많은 웹 API는 보통 json 형식으로 데이터를 제공하게됩니다. Unity에서는 json응답을 쉽게 분석하고 데이터를 사용할 수 있습니다.
3. Unity PlayerPrefs :
Unity 내부적으로 사용되는 PlayerPrefs는 json을 내부적으로 사용해서 데이터를 저장합니다.
4. 플렛폼 호환 :
json은 다양한 게임 또는 기술 간의 플랫폼 간 데이터 교환에 유용합니다.
TIP ! .json, .xml 데이터 선택 조건
1. 가독성?
xml은 사람이 해석하기에는 더 장황하게 데이터를 표현할 수 있으며, json은 사람과 기계가 모두 간결하고 쉽게 해석을 할 수 있습니다.
2. 복잡성?
간단한 데이터 구조일 경우 좀더 가벼운 json 데이터 형식이 더 적합하다. 하지만 복잡하고 중첩이 많은 데이터인 경우 xml 데이터의 계층구조가 더 명확할 수 있다.
3. 통합?
프로젝트마다 사용해야하는 외부시스템이나 API를 통해 요구사항에 맞게끔 데이터 형식을 선택해야 할 수 있습니다.
4. 성능?
json은 xml보다 구문 분석속도는 우위에 있으므로 차이가 발생한다.
5. Unity에서의 사용?
unity에서 xml 구문 분석을 위해 System.Xml을 사용하며, json의 직렬화 역직렬화를 위해 내장 JsonUtility 클래스와 같은 라이브러리를 사용해서 구현할 수 있습니다.
unity에서 XML 데이터 사용 방법
1. .xml 파일 생성 후 저장
<?xml version="1.0" encoding="UTF-8"?>
<Item>
<id>1</id>
<name>A</name>
</Item>
<Item>
<id>2</id>
<name>B</name>
</Item>
</dataroot>
2. XMLData.xml 파일 생성 후 Unity 프로젝트 Resources 생성 후 저장
3. Unity에서 출력을 위한 C# 스크립트 구현
구현하기 앞서 unity에서 xml데이터를 처리하기 위해서는 System.Xml 라이브러리를 활용해 구현을 하게 되는데 주요 클래스 및 메서드가 존재합니다.
1) XmlDocument 클래스 :
XML 데이터를 표현하는 클래스로 .xml데이터를 불러와 속성과 요소값을 처리합니다.
2) XmlNode 클래스 :
XML 데이터의 노드를 나타내는 기본적인 클래스로 모든 유형의 노드를 처리합니다.
3) XmlElement 클래스 :
XML 데이터의 요소를 나타내는 클래스로 요소의 이름, 속성 및 하위 요소를 처리합니다.
4) XmlAttribute 클래스 :
Xml 데이터의 속성을 나타내는 클래스로 속성의 이름과 값을 처리합니다.
5) XmlNodeList 클래스 :
XmlNode 클래스로 묶인 컬렉션을 나타내는 클래스로, 여러 노드를 선택하고 처리합니다.
6) XPathNavigator 클래스 :
XPath 쿼리를 사용해서 XML 문서를 탐색하고 조작하는 클래스.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;
public class XMLParsing : MonoBehaviour
{
string xmlFileName = "XMLData";
void Start()
{
LoadXML(xmlFileName);
}
private void LoadXML(string _fileName)
{
TextAsset txtAsset = (TextAsset)Resources.Load("XMLData/" + _fileName);
XmlDocument xmlDoc = new XmlDocument();
Debug.Log("XML DATA NAME : " + txtAsset.text);
xmlDoc.LoadXml(txtAsset.text);
// 데이터 하나씩 출력
XmlNodeList select_nodes = xmlDoc.GetElementsByTagName("name");
foreach (XmlNode item in select_nodes)
{
Debug.Log("name : " + item.InnerText);
}
Debug.Log("------------------------------------------------------");
// 모든 데이터 출력
XmlNodeList all_nodes = xmlDoc.SelectNodes("dataroot/Item");
foreach (XmlNode node in all_nodes)
{
Debug.Log("id :" + node.SelectSingleNode("id").InnerText);
Debug.Log("name : " + node.SelectSingleNode("name").InnerText);
}
}
}
4. 결과 출력
unity에서 Json 데이터 사용 방법
1. Unity C# 코드에서 오브젝트 데이터를 Json형식으로 데이터 삽입
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JsonParsing : MonoBehaviour
{
class Person
{
public string name;
public int age;
public void SetPerson()
{
Debug.Log("Name : " + name);
Debug.Log("Age : " + age);
}
}
void Start()
{
Person person = new Person();
person.name = "Song";
person.age = 25;
string str = JsonUtility.ToJson(person);
Debug.Log("Person : " + str);
}
}
2. Json형식 데이터를 다시 오브젝트 형으로 변환
public class JsonParsing : MonoBehaviour
{
class Person
{
public string name;
public int age;
public void SetPerson()
{
Debug.Log("Name : " + name);
Debug.Log("Age : " + age);
}
}
void Start()
{
Person person = new Person();
person.name = "Song";
person.age = 25;
string str = JsonUtility.ToJson(person);
//Debug.Log("Person : " + str);
Person person2 = JsonUtility.FromJson<Person>(str);
person2.SetPerson();
}
}
3. json 파일로 저장하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class JsonParsing : MonoBehaviour
{
class Person
{
public string name;
public int age;
public void SetPerson()
{
Debug.Log("Name : " + name);
Debug.Log("Age : " + age);
}
}
void Start()
{
// Person person = new Person();
// person.name = "Song";
// person.age = 25;
// string str = JsonUtility.ToJson(person);
//Debug.Log("Person : " + str);
// Person person2 = JsonUtility.FromJson<Person>(str);
// person2.SetPerson();
Person person3 = new Person();
person3.name = "Kim";
person3.age = 31;
File.WriteAllText(Application.dataPath + "/Person.json", JsonUtility.ToJson(person3));
}
}
4. 저장한 .json파일 로드
public class JsonParsing : MonoBehaviour
{
class Person
{
public string name;
public int age;
public void SetPerson()
{
Debug.Log("Name : " + name);
Debug.Log("Age : " + age);
}
}
void Start()
{
// Person person = new Person();
// person.name = "Song";
// person.age = 25;
// string str = JsonUtility.ToJson(person);
//Debug.Log("Person : " + str);
// Person person2 = JsonUtility.FromJson<Person>(str);
// person2.SetPerson();
Person person3 = new Person();
person3.name = "Kim";
person3.age = 31;
File.WriteAllText(Application.dataPath + "/Person.json", JsonUtility.ToJson(person3));
string str2 = File.ReadAllText(Application.dataPath + "/Person.json");
Person person4 = JsonUtility.FromJson<Person>(str2);
person4.SetPerson();
}
}