프로그래밍/유니티
[유니티] XML테이블 사용하기 (1)
갓똥
2022. 10. 28. 10:32
728x90
반응형
<?xml version="1.0"?>
<ItemContainer>
<Item Index="1000001" Name="Sword" ItemType="Equip" Damage="12.3"/>
</ItemContainer>
이런내용의 XMl파일을 유니티에서 써보자.
using System;
using System.IO;
using System.Xml.Serialization;
using UnityEditor;
using UnityEngine;
[Serializable]
[XmlRoot("ItemContainer")]
public class ItemXML : ScriptableObject
{
[XmlElement("Item")]
public ItemInfo item;
public void Save(string path)
{
#if UNITY_EDITOR
AssetDatabase.CreateAsset (this, path);
EditorUtility.SetDirty(this);
AssetDatabase.SaveAssets ();
AssetDatabase.Refresh();
#endif
}
public static ItemXML Load(string path)
{
if (File.Exists (path) == false)
return null;
var serializer = new XmlSerializer(typeof(ItemXML));
using (var stream = new FileStream(path, FileMode.Open))
{
return serializer.Deserialize(stream) as ItemXML;
}
}
public override string ToString()
{
return $"ItemInfo:[Index:{item.Index}({item.Index.GetType()}) / Name:{item.Name}({item.Name.GetType()}) / ItemType:{item.ItemType}({item.ItemType.GetType()}) / Damage:{item.Damage}({item.Damage.GetType()})]";
}
}
[Serializable]
public class ItemInfo
{
public enum eItemType
{
Equip,
Potion,
Etc
}
[XmlAttribute("Index")]
public int Index;
[XmlAttribute("Name")]
public string Name;
[XmlAttribute("ItemType")]
public eItemType ItemType;
[XmlAttribute("Damage")]
public float Damage;
}
먼저 XML파일을 읽고 쓸 코드를 작성한다.
XML의 루트 (위에서는 ItemContainer)는 class위에 root로 적는다.
그리고 Editor폴더안에 아래 스크립트를 추가한다.
using UnityEditor;
public class ItemXmlConverter : EditorWindow
{
[MenuItem("Converter/ItemXmlConverter")]
private static void ItemContainerConverter()
{
var path = EditorUtility.OpenFilePanel("Overwrite with xml", "", "xml");
if (path.Length != 0)
{
var item = ItemXML.Load(path);
item.Save("Assets/Resources/Table/ItemTable.asset");
}
}
}
해당 스크립트를 추가하게 되면
유니티 상단 메뉴에서 Converter => ItemXmlConverter를 통해 컨버팅이 가능해진다.
만들어놓은 메뉴를 통해 컨버팅을 누르고 컨버팅할 xml파일을 클릭하면
이렇게 써놓은 경로에 ScriptableObject가 만들어진다.
코드를 수정해서 원하는 위치에 저장하거나 하면 될 것 같다.
ScriptableObject의 내용
필드와 필드타입, 값이 잘 들어가있다.
728x90
반응형