1. 오늘의 할 일
팀플이 끝나면 개인과제 주간이 온다.
그렇다. 이번에도 개인 과제다.
결정한 것은 3D 자동사냥게임.
Scriptable Object로 데이터를 관리하라고 하니 배운 걸 정리할 겸 렛츠고
2. 내용 정리 ─ 데이터 드리븐
데이터 드리븐이란?
: 동작, 코드 등을 직접 쓰지 않고, Json, csv, xml 등 외부 데이터를 이용해 제어하거나 구성하는 방식
장점: 로직-데이터 분리
데이터와 로직을 분리하는 것으로, 얻을 수 있는 이득: 대부분의 경우 데이터만 수정하고, 코드는 수정하지 않아도 되거나 크게 수정할 필요가 없다.
1. Scriptable Object
: Unity에서 제공하는 데이터 저장 방식이다.
솔직히 지금까지 만들 때는 어차피 Unity로만 만들고 Unity로만 돌리는 싱글 게임이기 때문에 아주 많이 애용했다.
기본적으로 Scriptable Object를 만드는 스크립트도 다른 스크립트의 코딩과 다를 게 없어서, 익숙해지니까 상당히 쉬운 편.
심지어 인스펙터 창에서 데이터를 추가/조절하니까 쓰기도 쉽고 보기도 쉽다.


이전 팀플에서 사용한 Scriptable Object의 인스펙터 화면이다.

레시피 부분의 스크립트
장점: Unity 특화. 눈으로 보기 쉽다. Unity 코딩할 때랑 다를 게 없으므로 쓰기도 쉽다. Unity에서 사용하는 스크립트들인 MonoBehavior와 별도로 연결하는 방식을 구현할 필요 없이 바로바로 연결이 된다.
단점: Unity 내부에서 구현하는 것이므로, 외부 서버와 연결해야 하는 게임(멀티 플레이 게임 등)에는 매우 부적합. 데이터가 많아지면 많아질 수록 아래와 같은 상태를 볼 수 있다.

이건 나름 레시피가 적은 편이고 더 늘어난다면...
...
하지만 그럼에도 불구하고 사용하기 편한 건 사실이고, 내부에서 더 세분화 하여 잘 저장한다면, Unity 단일 사용 게임 프로젝트+서버없는 싱글 플레이 게임(ex: 추리 게임)에서는 이만한게 없다.
2. CSV
: 통상적으로 , (콤마) 를 사용해서 데이터를 저장하는 형식이다.
쉼표로 만드는 표의 형식을 띄는데, 다음과 같은 특징을 가진다.
이름, 레벨, 종족, 공격력
string, int, string, int
티백, 19, 고래, 10
샘플, 1, 감자, 1
리븐, 49, 인간, 40
위는 4x5 의 표의 형식을 가진 CSV다.
특징: 각 줄은 하나의 행, 쉼표는 열을 구분한다. 모든 행은 열의 개수가 같아야 한다. (첫 행이 4개의 열을 가진다면, 그 아래도 순서에 맞춰 4개의 열을 가져야 한다.)
장점: 엑셀>CSV로 쉽게 변환이 가능하다. Unity를 몰라도 쉽게 수정이 가능하다. 기초적인 가독성이 좋으며, 엑셀을 쓸 줄 알기만 한다면(그게 아니라도 표만 볼 줄 안다면) 이해하기 쉬워서 누구나 데이터를 편하게 쓰고 수정할 수 있다. 단순하고 간단해서 범용성이 좋다.
단점: 가독성이 좋은 건 어디까지나 적은 양의 데이터 한정. 데이터가 많아지면 많아질 수록 가독성이 떨어지며, (10x10만 되어도...)데이터 오염에 취약하다. 복합적인 내용을 쓰지 못하는 것도 치명적.(리스트 안에 리스트 안에 리스트 넣기가 안 된다.)
그래서 Scriptable Object처럼 서버를 사용하지 않는 싱글플레이 게임에, 협업자가 Unity 사용법은 잘 모를 경우 쓰기 좋다.
3. Json(JavaScript Object Notation)
: 스팀에서 게임 좀 많이 사봤다, 게임 폴더 많이 좀 봤다 하는 사람들은 많이 봤을 확장자.
사실상 개인-소규모 게임 제작에서 데이터를 담을 방법을 뽑으라고 하면 과장해서 십중팔구 선택할 데이터 저장 방식.

당장 스팀에 들어가서 자신이 가진 게임 중 개인/소규모 회사에서 만든 게임 폴더 몇 개만 들어가도, 대부분 Json 하나즈음은 품에 품고 있을 것이다.
(저 게임은 My Dream Setup)
그리고 여기서부터는 꽤 많이 써서, 뒤의 바이너리랑 같이 사용하는 경우도 잦다.
장점: 범용성. (진짜 어디서든 쓴다) 서버와 데이터도 주고받을 수 있기 때문에, '소규모' 멀티 플레이 게임에서는 충분히 활용 가능하다. 또한 (유니티 기본 제공 Json이 아니라) Newton Json 을 사용하면 복합적인 데이터 처리도 가능하다.(리스트 안에 리스트 넣고 배열 안에 배열 깔기가 된다.)
단점: Unity 자체 내장 기능인 Scriptable Object와 달리 반드시 파싱을 해줘야한다.
그리고 가독성. 하지만 데이터 양이 작을 때는 그렇게 못 볼 정도는 아니다.

물론 기본형은 이걸 일렬로 그냥 쭉 쓰는 것인데, 이렇게 엔터로 쳐도 문제 없다. (이쪽이 더 파악하기 쉽다)
기본형은 이렇게 되어 있어서, 최악의 가독성을 알려주는 것 같기도 하다.

구분은 CSV와 마찬가지로 콤마(,) 로 되지만, 그 외에도 " ", { }, [ ] 도 사용된다.
물론 이렇게 쓰다보면 헷갈리기는 (...) 쉽다. (사실 나도 저거 쓰다가 헷갈려서 빨간 줄 잔뜩 띄워봤다)
컴퓨터가 읽기 쉬워서 여러모로 쓰기 좋지만, 중괄호{} 대괄호 [] 따옴표 " " 콤마"," 를 다 쓰다보니 너무 많아지면 무거워진다. (그래도 XML 보다는 낫다)
그럼에도 실보다는 득이 많으므로, 보편적으로 많이 사용하는 데이터 저장법.
4. Binary(바이너리)
: 보통 개인 제작 게임에서는 많이 쓰지 않는다.
0과 1의 이진수로만 만들어낸, 완벽한 컴퓨터 전용 파일.
압축에 압축을 극한까지 할 수 있다. (기본이 100이라면 80%는 줄일 수 있다..)
장점: 보안성은 위에 있는 다른 3개의 방법보다 훨씬 좋다.(당연하다. 0과 1로만 이루어져있는데 그냥 읽을 줄 알면 그건 로봇이다...) 용량이 매우 적다. 마찬가지로 엑셀을 응용할 수 있어, 아주 많은 데이터를 담고 옮기기 좋다. (동시 접속자가 많고 서버통신이 필요한 MMORPG에서 사용하기 좋음)
단점: 0과 1로만 이루어져 있어서 수정하기 힘들다. Json 같은 다른 형태로 컨버팅 된 파일이 있어야 겨우 디버깅할 수 있다. 파일 읽어내는 전용 해독기 필요함(?)
압축률을 고려하면 효율성 만큼은 최고지만, 소규모의 데이터만을 사용한다면 도리어 굳이 쓸 필요가 없다...
가독성을 챙기기 위해 읽기용 Json이나 그 외의 다른 파일을 쓰는 모양이다.
이건 지금 쓸 수 있으면 여기 졸업해도 좋을 정도의 실력이라고 생각한다.
3. 마무리
결론으로 간단하게 정리해보자면,
1. 당장 쓸 줄 아는 게 좋고 편한 것 : Scriptable Object
2. 당장 쓰지는 못해도 최소한 읽을 줄 아는 게 좋은 것: Json
3. 언젠가 익히는 쪽이 좋은 것: Binary
4. 아무튼 알고 있으면 좋은 것: csv
XML은요? : 쓰면 나쁠 건 없는데 Unity를 쓰고, json 쓸 줄 알면 굳이...
'Unity_본캠프' 카테고리의 다른 글
[내일배움캠프 43일차] 인벤토리~인벤토리~ (1) | 2025.06.10 |
---|---|
[내일배움캠프 41일차] 상태관리자 State Machine (1) | 2025.06.05 |
[내일배움캠프 39일차] 뚝딱딱 뚝딱 제작대 만들기 (2) | 2025.06.02 |
[내일배움캠프 36일차] 나무가 다시 생성되게 해보자 (0) | 2025.05.28 |
[내일배움캠프 34일차] 새로운 팀플 개시 (1) | 2025.05.26 |