데이터 테이블 만들기


어제 만든 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 클래스를 만들었다.
파싱 하는 부분은 아래 블로그를 참고했다.
[유니티/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 개발 부분을 쭉 넣고 나니 꽤 길어졌다.
필요하겠다 싶은 부분도 중간중간 추가했다.
'개인프로젝트 > [Unity] 키우기 게임' 카테고리의 다른 글
[Unity] 키우기 게임 개발 일지 Day 6 (2) | 2024.03.23 |
---|---|
[Unity] 키우기 게임 개발 일지 Day 5 (1) | 2024.03.22 |
[Unity] 키우기 게임 개발 일지 Day 3 (0) | 2024.03.20 |
[Unity] 키우기 게임 개발 일지 Day 2 (0) | 2024.03.19 |
[Unity] 키우기 게임 개발 일지 Day 1 (1) | 2024.03.11 |