[Unity] DataManager

Jihoon·2022년 4월 5일
1

MMO_Unity

목록 보기
13/22

게임 내에서 사용되는 데이터를 코드 안에 정의한다면 유지보수 측면에서 매우 불리해진다.
(게임 내 수치를 변화하는 패치를 할 때마다 스토어에 새로 올려야 한다.)
따라서 수치 등을 Xml 혹은 Json 파일로 저장하고 코드로 불러오는 방식으로 게임 내 데이터를 관리하는 것이 유리하다.

DataManager

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Data 
{ 
#region
    [Serializable]
    public class Stat
    {
        public int level;
        public int maxHp;
        public int attack;
        public int totalExp;
    }

    [Serializable]
    public class StatData : ILoader<int, Stat>
    {
        public List<Stat> stats = new List<Stat>();

        public Dictionary<int, Stat> MakeDict()
        {
            Dictionary<int, Stat> dict = new Dictionary<int, Stat>();
            foreach (Stat stat in stats)
                dict.Add(stat.level, stat);
            return dict;
        }
    }
#endregion
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public interface ILoader<Key, Value>
{
    Dictionary<Key, Value> MakeDict();
}

public class DataManager
{
    public Dictionary<int, Data.Stat> StatDict { get; private set; } = new Dictionary<int, Data.Stat> ();

    public void Init()
    {
        StatDict = LoadJson<Data.StatData, int, Data.Stat>("StatData").MakeDict();
    }

    Loader LoadJson<Loader, Key, Value>(string path) where Loader : ILoader<Key, Value>
    {
        TextAsset textAsset = Managers.Resource.Load<TextAsset>($"Data/{path}");
        return JsonUtility.FromJson<Loader>(textAsset.text);
    }
}

[Serializable]는 외부 파일에서 데이터를 가져올 때 작성해야한다.

MakeDict() 함수 내에서 Dictionary에 값을 foreach문을 사용해서 추가하고 있는데 이 부분은 Linq를 사용해서 대체 가능하지만 Linq가 아이폰에서의 버그가 많기 때문에 Linq를 사용하지 않는 것을 추천한다고 한다.

profile
클라이언트 개발자 지망생

0개의 댓글