Unity/Scripts

Unity에서 xml, json 데이터 파일 파싱 방법 및 정의

공훈이 2023. 8. 16. 06:57
반응형

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"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Item>
    <id>1</id>
    <name>A</name>
  </Item>
  <Item>
    <id>2</id>
    <name>B</name>
  </Item>
</dataroot>

 

2. XMLData.xml 파일 생성 후 Unity 프로젝트 Resources 생성 후 저장 

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. 결과 출력

Xml 출력 결과

 

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();
    }
}

반응형