프로그래밍/유니티
[유니티] XML테이블 사용하기 (2)
갓똥
2022. 11. 8. 00:41
728x90
반응형
1. 컨버팅 안하고 바로 불러오기
앞선 1편에서 XML테이블을 ScriptableObject로 만들어 사용하는 것을 알아봤다.
하지만 개발과정에서 테이블 값을 수정하고 매번 컨버팅을 하기가 귀찮을 수 있다.
이럴 땐 ItemXML 클래스에 아래 메소드를 추가해서 편하게 쓸 수 있다.
public static ItemXML LoadDirect()
{
var t = Resources.Load("Table/Items") as TextAsset;
if (t == null)
return null;
var serializer = new XmlSerializer(typeof(ItemXML));
using (var stream = new StringReader(t.text))
{
return serializer.Deserialize(stream) as ItemXML;
}
}
위 메소드를 추가 한 후 GameManager나 Data관리 클래스에서 호출해주면 된다.
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()})]";
}
테스트를 위해 추가해놨다.
결과
잘 나온당
2. 기본 타입 외 컨버팅
기본 타입은 1편을 보면 알게 된다.
<?xml version="1.0"?>
<ItemContainer>
<Item Index="1000001" Name="Sword" ItemType="Equip" Damage="12.3">
<ItemColor r="255" g="255" b="255" />
</Item>
</ItemContainer>
예를들어 위와 같이 색상이 필요하다면
[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;
//***
[XmlElement("ItemColor")]
public ItemColor ItemColor;
}
public class ItemColor
{
[XmlAttribute("r")]
public int r;
[XmlAttribute("g")]
public int g;
[XmlAttribute("b")]
public int b;
public Color GetColor()
{
return new Color(r / 255.0f, g / 255.0f, b / 255.0f);
}
}
이런식으로 코드를 작성하면 된다.
결과
3. Array
<?xml version="1.0"?>
<ItemContainer>
<Items>
<Item Index="1000001" Name="Sword" ItemType="Equip" Damage="12.3"/>
<Item Index="1000002" Name="Shield" ItemType="Equip" Damage="23.4"/>
<Item Index="1000003" Name="Armor" ItemType="Equip" Damage="34.5"/>
<Item Index="1000004" Name="Red Potion" ItemType="Potion" Damage="50"/>
<Item Index="1000005" Name="Blue Potion" ItemType="Potion" Damage="100"/>
<Item Index="1000006" Name="Green Potion" ItemType="Potion" Damage="150"/>
<Item Index="1000007" Name="Etc01" ItemType="Etc" Damage="1"/>
<Item Index="1000008" Name="Etc02" ItemType="Etc" Damage="2"/>
<Item Index="1000009" Name="Etc03" ItemType="Etc" Damage="3"/>
</Items>
</ItemContainer>
이런식으로 Items 요소 하위에 요소가 많을 때
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using UnityEditor;
using UnityEngine;
[Serializable]
[XmlRoot("ItemContainer")]
public class ItemXML : ScriptableObject
{
[XmlArray("Items"), XmlArrayItem("Item")]
public List<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;
}
}
}
[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;
}
Attribute와 타입을 List로 바꾼 것 밖에 없다.
해당 코드 작성 후 1편에서의 컨버터를 이용하여 컨버팅을 하게 되면
잘 나온다.
728x90
반응형