차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
unity:xml [2015/05/21 14:02] – 문서가 unity3d:xml에서 unity:xml(으)로 옮겨졌습니다 V_Lunity:xml [2018/02/22 03:04] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
-====== Xml ====== +{{tag>xml 유니티 초보}} 
 +====== 게임내부의 설정 수치를 XML로 불러오기  ======
  
 http://forum.unity3d.com/threads/xml-reading-a-xml-file-in-unity-how-to-do-it.44441/ http://forum.unity3d.com/threads/xml-reading-a-xml-file-in-unity-how-to-do-it.44441/
 +
 + 
 +SQLite는 프로버전만 가능하므로 XML을 사용한다.
 +
 +
 +게임에서 사용하는 각종 수치를 하드코딩하지 않고 XML로 불러와서 적용하기 위해서 만듦.
 +기획자가 만든 수치를 게임에 적용시키기 위해 배워야 한다.
 +게임 상태를 저장하거나 불러오는 것을 원하는 분들이 있다면 PlayerPrefs를 참조 해주시기 바란다.
 +
 +유니티로 맵데이터나 기본 케릭터 정보를 저장할때 XML을 사용한다.
 +
 +본 자료는 인터넷에 있는 자료를 토대로 정리되었다.
 +
 +
 +=====XmlDocument 저장=====
 +  using System.Xml;
 +필수는 아니지만 각 함수를 사용할 때 System.Xml을 쓰는건 코드 효율이 떨어지므로 using해둡니다.
 +
 +  System.Xml.XmlDocument Document = new System.Xml.XmlDocument();
 +새로운 XML 문서를 만듭니다.
 +
 +  XmlElement myElement = Document.CreateElement("Item");
 +새로운 요소를 만듭니다. Element는 요소, 성분이라는 뜻이다.
 +
 +  myElement.SetAttribute("Name", "아이템");
 +요소에 속성을 지정한다. 속성의 이름, 속성의 값이 들어간다.
 +
 +  ItemElement.GetAttribute("Name");
 +요소로부터 값을 가져온다. 반환된 값은 문자열 이다.
 +
 +  Document.AppendChild(ItemListElement);
 +Document에 첨부 한다. Append는 첨부 라는 뜻이다.
 +
 +  Document.Save(filePath);
 +XML Document를 저장한다.
 +
 +=====XmlDocument 불러오기=====
 +
 +  XmlDocument Document = new XmlDocument();
 +새로운 XML 문서를 만듭니다.
 +
 +  Document.Load(filePath);
 +XML Document를 불러온다.
 +
 +
 +
 +=====완성 코드 ( 저장, 불러오기 )=====
 +
 +<file cs>
 +
 +using UnityEngine;
 +using System.Collections;
 +using System.Collections.Generic;
 +
 +using System.Xml;
 +
 +public class RecItem
 +{
 +    public    string    Name;
 +    public    int        Level;
 +    public    float    Critical;
 +}
 +
 +public sealed class ItemIO
 +{
 +    public static void Write(List<RecItem> ItemList, string filePath)
 +    {
 +        XmlDocument Document = new XmlDocument();
 +        XmlElement ItemListElement = Document.CreateElement("ItemList");
 +        Document.AppendChild(ItemListElement);
 +
 +        foreach(RecItem Item in ItemList)
 +        {
 +            XmlElement ItemElement = Document.CreateElement("Item");
 +            ItemElement.SetAttribute("Name", Item.Name);
 +            ItemElement.SetAttribute("Level", Item.Level.ToString());
 +            ItemElement.SetAttribute("Critical", Item.Critical.ToString());
 +            ItemListElement.AppendChild(ItemElement);
 +        }
 +        Document.Save(filePath);
 +    }
 +
 +    public static List<RecItem> Read(string filePath)
 +    {
 +        XmlDocument Document = new XmlDocument();
 +        Document.Load(filePath);
 +        XmlElement ItemListElement = Document["ItemList"];
 +
 +        List<RecItem> ItemList = new List<RecItem>();
 +
 +        foreach(XmlElement ItemElement in ItemListElement.ChildNodes)
 +        {
 +            RecItem Item = new RecItem();
 +            Item.Name = ItemElement.GetAttribute("Name");
 +            Item.Level = System.Convert.ToInt32(ItemElement.GetAttribute("Level"));
 +            Item.Critical = System.Convert.ToSingle(ItemElement.GetAttribute("Critical"));
 +            ItemList.Add(Item);
 +        }
 +        return ItemList;
 +    }
 +}
 +</file>
 +
 +RecItem이라는 클래스 자료를 이용하여 저장 및 불러오기를 만들었다.
 +
 +=====저장=====
 +"ItemList" 요소를 만들고 XML Document에 넣었다.
 +List로 받은 데이터를 itemList에 갯수만큼 넣을 준비를 한다.
 +요소 "Item" 하나 만듭니다.
 +값은 문자열로만 저장이 가능하므로 ToString()을 사용한다. 숫자로 된 자료는 이런식으로 저장한다.
 +그리고 완성이 된 아이템은 "ItemList"에 담다.
 +for문이 끝나고 나면 저장 한다.
 +
 +사용의 예)
 +<file cs>
 +using UnityEngine;
 +using System.Collections;
 +using System.Collections.Generic;
 +
 +public class WriteTest : MonoBehaviour
 +{
 +    void Start()
 +    {
 +        List<RecItem> itemList = new List<RecItem>();
 +
 +        for(int i = 0; i < 100; ++i)
 +        {
 +            RecItem item = new RecItem();
 +            item.Name = "아이템";
 +            item.Level = 1;
 +            item.Critical = Random.Range(0.1f, 1.0f);
 +            itemList.Add(item);
 +        }
 +        ItemIO.Write(itemList, Application.dataPath + "/Output/ItemList_Attributes.xml");
 +    }
 +}
 +
 +</file>
 +
 +=====불러오기=====
 +XML형식으로 저장된 파일을 불러온다.
 +불러온 문서의 "ItemList";에 해당하는 요소를 가져온다. ( C#에서는 문자열을 Index화 시키기 때문에 가능한다 )
 +RecItem 자료형 리스트를 만듭니다.
 +이제 for문을 돌면서 XML Document로부터 RecItem List로 값을 가져 온다.
 +문자열이 아닌 데이터는 System.Convert.ToInt32 , System.Convert.ToSingle 를 이용하여 변환한다. (정수, 실수)
 +
 +사용의 예)
 +<file cs>
 +using UnityEngine;
 +using System.Collections;
 +using System.Collections.Generic;
 +
 +public class ReadTest : MonoBehaviour
 +{
 +    void Start()
 +    {
 +        List<RecItem> itemList = ItemIO.Read(Application.dataPath + "/Output/ItemList_Attributes.xml");
 +        for(int i = 0; i < itemList.Count; ++i)
 +        {
 +            RecItem item = itemList[i];
 +            Debug.Log(string.Format("Item[{0}] : ({1}, {2}, {3})",
 +                i, item.Name, item.Level, item.Critical,));
 +        }
 +    }
 +}
 +
 +</file>
 +
 +
 +
  
  
-{{tag>xml}}