개요
기획자와 원활한 협업을 위해, 그리고 유지보수성과 확장성을 높이기 위해 데이터 수치들을 엑셀 파일로 관리한다.
이러한 이유로 게임 엔진에서 엑셀 파일을 불러오는 기능은 필수적으로 구현할 줄 알아야 한다.
여러 게임 엔진 중에서 오늘은 유니티에서 엑셀 파일을 불러오는 방법을 알아보자.
1. 엑셀 파일 변환
![]() |
대사 데이터테이블을 예로 들고자 한다. 우선 유니티의 TextAsset이라는 변수 기능을 활용할건데 이를 위해 엑셀파일을 txt 확장자로 변경해주어야 한다.
![]() |
다른 이름으로 저장을 선택하면 파일형식 탭에서 여러 확장자로 변경할 수 있을텐데 이 중에 텍스트 문서(탭으로 구분)을 선택해서 저장한다.
![]() |
저장된 텍스트 파일을 열어보면 이런 형식으로 저장이 되어있을텐데 우측 하단을 보면 인코딩 형식이 ANSI로 되어있다. 이 상태로 유니티에 파일을 지정하면 한글이 깨지므로 UTF-8 인코딩 형식으로 변경해주어야 한다.
![]() |
텍스트 파일에서 다른 이름으로 저장을 선택하면 하단 부분에서 인코딩 형식도 변경해줄 수 있다. 여기서 "UTF-8"을 선택해서 저장한다.
2. 코드 작성
[SerializeField] TextAsset dialogueDatatable;
void UpdateDialogueDatatable()
{
StringReader reader = new(dialogueDatatable.text);
bool head = false;
while (reader.Peek() != -1)
{
string line = reader.ReadLine();
if(!head)
{
head = true;
continue;
}
string[] values = line.Split('\t');
// values[0] => ID
// values[1] => Character
// values[2] => Sprite
// values[3] => Dialogue
// values[4] => Situation
// ...
}
}
StringReader 클래스를 활용하면 텍스트 파일의 데이터를 읽어올 수 있다.
Peek( ) 메서드는 다음에 읽을 문자가 있으면 해당 문자의 정수값을 반환하고, 파일의 끝이면 -1을 반환한다.
하지만 Peek( )만 사용하면 다음 줄로 넘어가지 않고 같은 부분만 확인하게 된다.
따라서 ReadLine( )을 사용해 파일의 한 줄 데이터를 받아온 후 다음 줄로 이동한다. 이렇게 받아온 line 변수에는 한 줄의 모든 데이터가 저장되는데, 이를 개별 항목으로 나눠야 한다. 텍스트 파일이 탭으로 구분되어 있으므로 Split( ) 메서드의 인자값을 '\t'로 설정하면 탭으로 구분된 문자열이 배열로 저장된다.
주석에 표시된 것처럼 결과적으로 values[0]에는 ID가, values[1]에는 Character ... 등의 데이터가 저장된다.
느낀 점
데이터테이블을 불러오는 기능을 구현해두면 코드 수정 없이 데이터테이블 값만 변경해도 되므로 프로젝트의 확장성과 유지보수성에 매우 유리하다. 내 경우에는 대사를 변경하고 싶을 때 대사 데이터테이블의 값만 변경하면 된다.
대사, 독백 등의 데이터테이블 관리하기도 벅찬데, 로스트아크나 메이플과 같은 대규모 MMORPG 게임의 경우에는 데이터테이블의 양이 엄청날 텐데 이 많은 데이터를 어떻게 관리하는지 ...
넥슨, 스마일게이트가 새삼 대단하다고 느껴지는 시간이었다
'유니티' 카테고리의 다른 글
[유니티] 안드로이드 파일 저장, 로드 (0) | 2025.01.05 |
---|