Unity_본캠프

[내일배움캠프 40일차] 오늘도 둔둔 개인과제 둔둔

티백고래 2025. 6. 4. 23:44

1. 오늘의 할 일

팀플이 끝나면 개인과제 주간이 온다.

그렇다. 이번에도 개인 과제다.

결정한 것은 3D 자동사냥게임.

Scriptable Object로 데이터를 관리하라고 하니 배운 걸 정리할 겸 렛츠고

 

2. 내용 정리 ─ 데이터 드리븐

데이터 드리븐이란?

: 동작, 코드 등을 직접 쓰지 않고, Json, csv, xml 등 외부 데이터를 이용해 제어하거나 구성하는 방식

 

장점: 로직-데이터 분리

데이터와 로직을 분리하는 것으로, 얻을 수 있는 이득: 대부분의 경우 데이터만 수정하고, 코드는 수정하지 않아도 되거나 크게 수정할 필요가 없다.

 

 

1. Scriptable Object

: Unity에서 제공하는 데이터 저장 방식이다. 

솔직히 지금까지 만들 때는 어차피 Unity로만 만들고 Unity로만 돌리는 싱글 게임이기 때문에 아주 많이 애용했다.

기본적으로 Scriptable Object를 만드는 스크립트도 다른 스크립트의 코딩과 다를 게 없어서, 익숙해지니까 상당히 쉬운 편.

심지어 인스펙터 창에서 데이터를 추가/조절하니까 쓰기도 쉽고 보기도 쉽다.

 

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

 

레시피 부분의 스크립트

 

장점: Unity 특화. 눈으로 보기 쉽다. Unity 코딩할 때랑 다를 게 없으므로 쓰기도 쉽다. Unity에서 사용하는 스크립트들인 MonoBehavior와 별도로 연결하는 방식을 구현할 필요 없이 바로바로 연결이 된다.

 

단점: Unity 내부에서 구현하는 것이므로, 외부 서버와 연결해야 하는 게임(멀티 플레이 게임 등)에는 매우 부적합. 데이터가 많아지면 많아질 수록 아래와 같은 상태를 볼 수 있다.

실제 팀플에서 사용한 Scriptable Object 수

 

이건 나름 레시피가 적은 편이고 더 늘어난다면...

...

하지만 그럼에도 불구하고 사용하기 편한 건 사실이고, 내부에서 더 세분화 하여 잘 저장한다면, 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와 달리 반드시 파싱을 해줘야한다.

그리고 가독성. 하지만 데이터 양이 작을 때는 그렇게 못 볼 정도는 아니다.

TextRPG에서 사용한 Skill데이터 Json

 

물론 기본형은 이걸 일렬로 그냥 쭉 쓰는 것인데, 이렇게 엔터로 쳐도 문제 없다. (이쪽이 더 파악하기 쉽다)

기본형은 이렇게 되어 있어서, 최악의 가독성을 알려주는 것 같기도 하다.

 

게임: 스타듀밸리 Content 폴더에 있는 json파일

 

구분은 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 쓸 줄 알면 굳이...