갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 모바일 게임 순위
  • 유니티 그래프
  • 전세계 게임 매출
  • Unity Graph
  • c# coroutine
  • 전세계게임매출순위
  • C++
  • 게임 매출 순위
  • 게임매출순위
  • c# 코루틴
  • c# collection
  • C++ virtual
  • C# boxing
  • 알고리즘
  • pc 게임 순위
  • C++ 상속
  • c# unboxing
  • c# delegate
  • c# Thread
  • C# 예외 처리
  • 강남 방탈출
  • 유니티 그래프 그리기
  • pc게임 순위
  • 게임 디자인 패턴
  • 유니티 골드그래프
  • 글로벌게임매출
  • C++ 소멸자
  • 자바
  • 롤 골드그래프
  • 2020년 게임 매출

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[유니티] XML테이블 사용하기 (2)
프로그래밍/유니티

[유니티] 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관리 클래스에서 호출해주면 된다.

 

GameManager에 추가함

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
반응형

'프로그래밍 > 유니티' 카테고리의 다른 글

[유니티] 화면전환 효과 (탕탕특공대 따라하기)  (2) 2022.12.07
[유니티] 해상도 고정 & 빈 공간 처리  (0) 2022.11.18
[유니티] XML테이블 사용하기 (1)  (0) 2022.10.28
[유니티] FPS 표기  (0) 2022.10.05
[유니티] 안드로이드 번들 빌드 오류 모음  (0) 2022.09.26
    '프로그래밍/유니티' 카테고리의 다른 글
    • [유니티] 화면전환 효과 (탕탕특공대 따라하기)
    • [유니티] 해상도 고정 & 빈 공간 처리
    • [유니티] XML테이블 사용하기 (1)
    • [유니티] FPS 표기
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바