07/21 ScriptableObject를 활용한 데이터 분리 설계

ScriptableObject
게임 데이터를 GameObject와 분리해 .asset 파일로 관리하는 클래스
핵심 개념
- GameObject에 붙이지 않는다.
- 프로젝트 안에 에셋 파일로 저장된다.
- 여러 오브젝트가 하나의 데이터를 공유할 수 있다.
- 아이템, 스킬, 캐릭터 능력치처럼 재사용되는 설정 데이터에 적합하다.
MonoBehaviour와 차이
| ScriptableObject | MonoBehaviour |
|---|---|
| 데이터 관리가 주목적 | 오브젝트 동작 구현이 주목적 |
| 에셋으로 존재 | GameObject에 컴포넌트로 부착 |
| GameObject가 필요 없음 | GameObject가 필요함 |
| 아이템·스킬·스탯 등에 사용 | 이동·공격·충돌 등에 사용 |
장점
- 같은 데이터를 여러 오브젝트에서 공유할 수 있다.
- 중복 데이터를 줄일 수 있다.
- 코드와 데이터를 분리해 관리할 수 있다.
- Inspector에서 값을 쉽게 수정할 수 있다.
주의점
- 값을 변경하면 해당 에셋을 공유하는 모든 오브젝트에 영향을 줄 수 있다.
- 런타임 데이터를 영구 저장하는 세이브 파일 용도로는 적합하지 않다.
- 변하지 않는 설정이나 원본 데이터를 관리할 때 사용하는 것이 좋다.
string과 StringBuilder 비교
| 구분 | string | StringBuilder |
|---|---|---|
| 네임스페이스 | System | System.Text |
| 객체 특성 | 불변 객체(Immutable) | 가변 객체(Mutable) |
| 문자열 변경 | 변경할 때마다 새로운 문자열 생성 | 내부 버퍼의 내용을 변경 |
| 문자열 연결 | 적은 횟수의 연결에 적합 | 반복적인 문자열 연결에 적합 |
| 성능 | 반복 연결 시 성능이 저하될 수 있음 | 반복 연결 시 효율적 |
| 메모리 | 중간 문자열 객체가 많이 생성될 수 있음 | 불필요한 객체 생성을 줄임 |
| 사용 방법 | +, 문자열 보간 $"" | Append(), AppendLine() |
| 스레드 안전성 | 불변이므로 안전하게 공유하기 쉬움 | 기본적으로 스레드 안전하지 않음 |
| 적합한 상황 | 문자열 변경이 적을 때 | 문자열을 반복적으로 조립할 때 |
불변 객체란?
불변 객체란 객체가 한 번 생성된 후에는 내부 값을 변경할 수 없는 객체입니다.
C#의 string은 대표적인 불변 객체입니다.
string text = "Hello";
text = text + " World";
위 코드를 보면 text의 내용이 바뀐 것처럼 보이지만, 실제 동작은 다음과 같습니다.
"Hello"문자열 객체가 생성됩니다."Hello World"라는 새로운 문자열 객체가 생성됩니다.text변수가 새로운 문자열을 참조합니다.- 기존
"Hello"문자열은 변경되지 않습니다.
다음 코드를 보면 더 쉽게 이해할 수 있습니다.
왜 StringBuilder를 사용하나요?
반복문에서 string을 계속 연결하면 새로운 문자열 객체가 반복적으로 생성되기 때문입니다.
string을 사용한 경우
string result = "";
for (int i = 0; i < 10000; i++)
{
result += i;
}
반복할 때마다 다음과 같은 문자열이 새로 생성됩니다.
""
"0"
"01"
"012"
"0123"
...
기존 문자열에 내용을 직접 붙이는 것이 아니라, 기존 내용과 새로운 내용을 합친 문자열 객체를 다시 생성합니다.
문자열이 길어질수록 기존 내용을 계속 복사해야 하므로 다음 문제가 발생할 수 있습니다.
- 불필요한 문자열 객체 생성
- 메모리 사용량 증가
- 가비지 컬렉션 부담 증가
- 실행 속도 저하
한글 폰트 만들기
- 한글 폰트 (ttf) 파일 준비
- Window -> TextMeshPro -> Font Asset Creator
- Generate font atlas
- 생성한 sdf 파일의 Atlas Population Mode를 Dynamic으로 변경 후, Sampling Point Size를 조절하면서 폰트 파일 제작
CSV 파일을 파싱하여 게임 데이터 제작하기
CSV 파일을 파싱하여 게임 데이터 제작하기
CSV에 작성된 아이템 정보를 읽어 각 행을 ItemData 스크립터블 오브젝트 에셋으로 변환한다.
처리 과정
- 에디터 메뉴에서 CSV 가져오기 기능을 실행한다.
- 파일 선택 창에서 CSV 파일을 선택한다.
- CSV 파일을 행 단위로 읽는다.
- 첫 번째 행은 열 이름을 나타내는 헤더이므로 제외한다.
- 각 행을 쉼표 기준으로 분리한다.
- 분리한 문자열을 데이터에 맞는 자료형으로 파싱한다.
- 아이템 번호와 수치 → 정수
- 아이템 이름과 설명 → 문자열
- 아이템 종류 → 열거형
- 각 행마다
ItemData스크립터블 오브젝트를 생성하고 파싱한 값을 저장한다. - 아이템 이름을 파일명으로 사용해
.asset파일을 생성한다. - 모든 에셋을 저장하고 Unity 프로젝트를 새로고침한다.
핵심 구조
CSV 읽기 → 행과 열 분리 → 자료형 변환 → 스크립터블 오브젝트 생성 → 에셋 저장
이 방식을 사용하면 엑셀이나 스프레드시트에서 관리한 데이터를 여러 개의 Unity 게임 데이터 에셋으로 자동 변환할 수 있다.
현재 방식은 쉼표를 기준으로 단순 분리하기 때문에 설명에 쉼표가 들어가거나 값이 누락된 CSV에서는 오류가 발생할 수 있다.



