데이터 테이블 만들기

 

어제 만든 enum에 key를 매칭하여 찾을 수 있게끔 경험치 테이블과 수입 테이블을 만들었다.

경험치는 이전 레벨의 두 배로, 수입은 무리 함수를 사용하여 만들었기 때문에 굳이 테이블을 만들지 않고 공식을 적용해도 되지만 이후 밸런스 조정이 편하도록 테이블로 작성하였다.

 

경험치 테이블과 수입 테이블을 보며 적절한 밸런스를 맞춰서 적절한 테이블을 만든다는 게 정말 쉽지 않았다.

솔직히 아직도 부족함이 많을 거라 생각하지만 3시간 동안 저 테이블을 붙잡고 있었으니 오늘은 이만하면 된 것 같다.

 

비어있는 부분들은 int 파싱에서 오류가 나기 때문에 파싱 하는 부분에서 예외처리 해주거나 0으로 채워주어야 한다.

나는 그냥 0으로 채웠으니 접근되지 않아야 하는 값에 접근하기 전에 힘들게 예외처리를 해야 될 예정이다.

 

데이터 테이블 파싱

우선 파싱 된 데이터를 담을 구조체를 만들었다.

public struct EXP
{
    public Rank Rank;
    public Level Level;
    public int Star1;
    public int Star2;
    public int Star3;
    public int Star4;
    public int Star5;
    public int Star6;

    public EXP(Rank Rank, Level Level, int Star1, int Star2, int Star3, int Star4, int Star5, int Star6)
    {
        this.Rank = Rank;
        this.Level = Level;
        this.Star1 = Star1;
        this.Star2 = Star2;
        this.Star3 = Star3;
        this.Star4 = Star4;
        this.Star5 = Star5;
        this.Star6 = Star6;
    }
}

public struct InCome
{
    public Rank Rank;
    public Level Level;
    public float Star1;
    public float Star2;
    public float Star3;
    public float Star4;
    public float Star5;
    public float Star6;

    public InCome(Rank Rank, Level Level, float Star1, float Star2, float Star3, float Star4, float Star5, float Star6)
    {
        this.Rank = Rank;
        this.Level = Level;
        this.Star1 = Star1;
        this.Star2 = Star2;
        this.Star3 = Star3;
        this.Star4 = Star4;
        this.Star5 = Star5;
        this.Star6 = Star6;
    }
}

 

그리고 CSV 파일을 가져와서 파싱 하는 기능을 가진 CSVParser 클래스와 파싱 된 데이터들을 관리할 DataManager 클래스를 만들었다.

 

파싱 하는 부분은 아래 블로그를 참고했다.

https://jinsso.tistory.com/8

 

[유니티/C#] DataTable의 모든 행 읽어오기

원래는 간단한 테이블만 사용해서, 코드도 간단하게 만들어서 사용하고 있었다. 그런데 게임 기획이 바뀌고 데이터를 저장해야할 일이 많아져서, 기존에 사용하던 코드로 작업을 진행했다가는

jinsso.tistory.com

 

public class CSVparser
{
    public DataTable CSVReader(string path)
    {
        DataTable table = new DataTable();

        StreamReader sr = new StreamReader(path);
        string[] headers = sr.ReadLine().Split(',');
        foreach (string line in headers)
        {
            table.Columns.Add(line);
        }

        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();
            string[] data = line.Split(',');

            DataRow row = table.NewRow();
            for (int i = 0; i < headers.Length; i++)
            {
                row[i] = data[i];
            }

            table.Rows.Add(row);
        }

        return table;
    }

    public List<EXP> ParseEXPTable(DataTable table)
    {
        List<EXP> result = new List<EXP>();

        foreach(DataRow row in table.Rows) 
        {
            Rank rank = (Rank)Enum.Parse(typeof(Rank), row["Rank"].ToString());
            Level level = (Level)Enum.Parse(typeof(Level), row["Level"].ToString());

            int star1 = int.Parse(row["Star1"].ToString());
            int star2 = int.Parse(row["Star2"].ToString());
            int star3 = int.Parse(row["Star3"].ToString());
            int star4 = int.Parse(row["Star4"].ToString());
            int star5 = int.Parse(row["Star5"].ToString());
            int star6 = int.Parse(row["Star6"].ToString());

            EXP exp = new EXP(rank, level, star1, star2, star3, star4, star5, star6);
            result.Add(exp);
        }

        return result;
    }

    public List<InCome> ParseInComeTable(DataTable table)
    {
        List<InCome> result = new List<InCome>();

        foreach (DataRow row in table.Rows)
        {
            Rank rank = (Rank)Enum.Parse(typeof(Rank), row["Rank"].ToString());
            Level level = (Level)Enum.Parse(typeof(Level), row["Level"].ToString());

            float star1 = float.Parse(row["Star1"].ToString());
            float star2 = float.Parse(row["Star2"].ToString());
            float star3 = float.Parse(row["Star3"].ToString());
            float star4 = float.Parse(row["Star4"].ToString());
            float star5 = float.Parse(row["Star5"].ToString());
            float star6 = float.Parse(row["Star6"].ToString());

            InCome inCome = new InCome(rank, level, star1, star2, star3, star4, star5, star6);
            result.Add(inCome);
        }

        return result;
    }
}
public class DataManager : MonoBehaviour
{
    public static DataManager instance;

    public List<EXP> EXPList;
    public List<InCome> InComeList;

    private void Awake()
    {
        if (instance != null)
            Destroy(gameObject);
        instance = this;
        DontDestroyOnLoad(gameObject);
    }

    private void Start()
    {
        CSVparser csvparser = new CSVparser();
        EXPList = csvparser.ParseEXPTable(csvparser.CSVReader(Application.streamingAssetsPath + @"\exp_table.csv"));
        InComeList = csvparser.ParseInComeTable(csvparser.CSVReader(Application.streamingAssetsPath + @"\income_table.csv"));

        // test
        Debug.Log(InComeList.Find(o => o.Rank == Rank.manager && o.Level == Level.expert).Star5);
    }
}

 

테스트 결과 23.78으로 제대로 작동했다.

저 Linq 함수를 매번 쓰기 귀찮을 것 같기 때문에 DataManager에 값을 찾는 함수를 따로 파두고 싶으나... 오늘 아직 할 일이 많기 때문에 내일 직원 성장 기능을 만들 때로 미뤘다.

 

 

 

 

UI 만들기

 

간단하게 박스 UI를 만들었다.

보유 직원 목록인 그리드 뷰, 직원을 클릭했을 때 나올 상세 화면이다.

 

그리고 UI에 기능을 넣으려고 하니 할 일이 한두 개가 아니라는 걸 깨달았다.

아무래도 UI에 드는 시간을 포함하여 일정을 다시 산정해야 되겠다...

 

 

오늘의 회고

원래 계획한 분량을 다 지키지 못했으나 예상한 일이다.

개발에 본격적으로 들어가니 계획에서 놓친 부분이 계속 보였다.

오늘 일정이던 한계 초월은 뽑기 기능을 만들 때 넣는 것으로 바꾸었다.

 

 

UI 개발 부분을 쭉 넣고 나니 꽤 길어졌다.

필요하겠다 싶은 부분도 중간중간 추가했다.

+ Recent posts