에셋스토어 링크
https://assetstore.unity.com/packages/tools/integration/bg-database-112262?aid=1101l7zGS
가격
40달러
어떤 에셋인가요?
유니티 내에서 사용할 수 있는 엑셀 형식의 데이터 베이스.
유니티 스프레드 시트와 연동 혹은 엑셀과 연동가능하다.
Enum 타입이나 Resources폴더의 직접링크 등도 지원한다.
개인 평가
너무 편해서 개인 개발하면서 앞으로도 계속 쓰고싶은 에셋이다.
처음 연동하고 세팅하는 부분은 초보자가 하기에는 조금 어려울 수 있지만,
세팅 한번 하고나면 정말 편하다고 느껴질 것이다.
주의할 점?
아직까지는 별도의 불편한점 없음.
서론
게임에 데이터 베이스가 필요한데,
보통 csv로 연동하겠지만, 유니티 내에서 값을 직접 수정할 수 있으면 편할 것 같아서 찾아보던중 찾은 에셋.
유니티 내에서 시트형식으로 데이터를 보고, 수정이 가능하다.
유니티 내에서 처리하는거라 유니티 클래스들의 레퍼런스 등도 셀에 저장가능.
실제 저장은 byte 형태로 저장해둔다.
추가적으로 빌드/에디터 상에서 실시간 구글 스프레드 시트 연동을 지원한다!
사실 이 기능이 더 메인같다. 서버 없는 인디게임에서 빌드 후 연동이 가능한 데이터베이스가 필요한 경우가 많으니.
구글의 API 접근 횟수가 분당 몇회식이라 디버깅용으로만 사용할수 있다고한다.
22-05-10 추가
BGDatabase가 초기 버전에 비해 꽤 바뀐 부분이 많아졌기에
현재 버전(1.7.5)에 맞춰 설명을 별도로 포스팅합니다.
2022.05.10 - [Unity 연구/BGDatabase] - BG Database 사용법 1 : 기본세팅
2022.05.10 - [Unity 연구/BGDatabase] - BG Database 사용법 2 : 데이터 생성하기
2022.05.10 - [Unity 연구/BGDatabase] - BG Database 사용법 3 : 구글 스프레드 시트 연동
2022.05.10 - [Unity 연구/BGDatabase] - BG Database 사용법 4 : Code Generation
아래 설명은 예전 글을 남겨둔 것입니다. 위쪽 링크의 글을 읽어주세요.
초기세팅
1) 에셋을 임포트 한 후, Window - BGDatabase 에서 창을 열어줍니다.
2) Settings - Main - Create new database 를 누른 뒤, 두 개의 경로를 설정해줍니다.
DatabaseFolder에는 생성된 DB가 저장되는 위치입니다. Resources 경로를 지정합니다.
settings file은 BGDataBase의 설정값이 저장됩니다. 임의의 프로젝트 폴더 내 위치로 지정합니다.
3) Create를 눌러 준 뒤, Save All 을 눌러 저장합니다. DB나 설정값을 바꾼다음 언제나 Save All을 눌러주는 습관을 들입시다.
4) Configuration에서 Metas왼쪽의 + 버튼을 눌러 테이블을 추가합니다.
Metas는 데이터 테이블과 1:1 대응되는 세팅값입니다.
주의할점은 엑셀파일이나 스프레드시트의 여러개랑 연동하는게 아니고,
Metas 마다 하나의 페이지가 생성된다는 점입니다.
5) 생성된 Metas에서 Fields를 +를 눌러 Field를 추가합니다.
6) 이후에는 Database 탭으로 가보면 설정해놓은 대로 시트가 자동 생성되어있는데,
역시 +버튼을 눌러서 데이터를 입력하면 됩니다.
코드상에서 데이터 사용하기
하나의 개별적인 데이터는 아래와 같이 가져올 수 있다.
시트 이름이 Shop_Product 인 첫 번째 줄의 string 자료형인 subTitle 필드 가져오기
// meta (시트) 가져오기. "" 안에는 시트이름.
var meta = BGRepo.I["Shop_Product"];
// 개별 entity (가로 줄) 가져오기. () 안에는 entity Name, ID, Index 중 한개를 인자로 받음
var entity = meta.GetEntity(0);
// 하나의 필드 값을 가져옴. string <> 안에는 자료형, "" 안에는 필드 명
var fieldValue = entity.Get<string>("subTitle");
string이 두번이나 요구된다. string을 쓴다는 건 결국 오타의 우려가 있음.
아래 설명할 CodeGeneration이라는 기능으로 보완 가능하다.
CodeGeneration
https://www.bansheegz.com/BGDatabase/CodeGeneration/
CodeGeneration이라는 것을 지원합니다.
기본 기능만사용하면 필연적으로 string을 사용해서 데이터를 불러오기 때문에, 오타의 우려가 있습니다.
이를 보완하기 위해 자체클래스를 만들어서 유효성검사를 할 수 있는 기능입니다.
사용법] Addons - CodeGen 을 클릭 후, Enabled를 체크한뒤 세팅을 해주고 Generate를 눌러주면 끝입니다.
Use default : 그냥 누르면 됩니다.
Chose file : 프로젝트 경로에 빈 스크립트 하나 만들어서 설정하면됩니다. Editor 폴더에 넣으면 안됩니다.
Classnames prefix : D_ 나 BG_같은 짧은 이름을 추천합니다.
Field names prefix : 역시 f_ 등의 짧은 이름을 추천합니다.
이제, 다시 위에서 데이터를 가져왔던 것과 비교해봅시다.
시트 이름이 Shop_Product 인 첫 번째 줄의 string 자료형인 subTitle 필드 가져오기
CodeGeneration을 사용하지 않았을 때
// meta (시트) 가져오기. "" 안에는 시트이름.
var meta = BGRepo.I["Shop_Product"];
// 개별 entity (가로 줄) 가져오기. () 안에는 entity Name, ID, Index 중 한개를 인자로 받음
var entity = meta.GetEntity(0);
// 하나의 필드 값을 가져옴. string <> 안에는 자료형, "" 안에는 필드 명
var fieldValue = entity.Get<string>("subTitle");
CodeGeneration을 사용했을 때
// 개별 entity (가로 줄) 가져오기. () 안에는 entity Name, ID, Index 중 한개를 인자로 받음
var entity = D_Shop_Product.GetEntity(0);
// 하나의 필드 값을 가져옴.
var fieldValue = entity.f_subTitle;
string이 완전히 제거되었다! 위와같이 오타 걱정없이 데이터를 가져올 수 있습니다.
주의할 건 DB의 필드를 추가하거나 이름이 수정된 경우 CodeGen 버튼을 다시 눌러 업데이트해야 합니다.
모든 데이터를 한번에 캐싱하고 싶을 때
그런데 entity Name이나 ID, Index 값을 알아야만 가져올 수 있다는 사실은 변하지 않습니다.
때문에 저는 복잡한 데이터의 경우 미리 리스트나 딕셔너리에 캐싱해놓고 쓰는걸 선호합니다.
시트 이름이 Shop_Product 인 데이터를 가공하여 ShopProduct라는 클래스를 만들고,
List<ShopProduct> 에 캐싱하기.
List<ShopProduct> shopProducts = new List<ShopProduct>();
List<BGEntity> entitys = BGRepo.I["Shop_Product"].EntitiesToList();
foreach (var entity in entitys)
{
ShopProduct shopProduct = new ShopProduct
(
entity.Index,
entity.Get<int>("shopIndex"),
entity.Get<int>("listIndex"),
entity.Get<int>("colorIndex"),
entity.Get<string>("title"),
entity.Get<string>("subTitle"),
new string[3] { entity.Get<string>("slotA"), entity.Get<string>("slotB"), entity.Get<string>("slotC") },
new float[4] { entity.Get<float>("prob_common"), entity.Get<float>("prob_magic"), entity.Get<float>("prob_rare"), entity.Get<float>("prob_legend") },
entity.Get<int>("price"),
entity.Get<float>("salePoint")
);
shopProducts.Add(shopProduct);
}
CodeGeneration을 사용했을 때
List<ShopProduct> shopProducts = new List<ShopProduct>();
D_Shop_Product.ForEachEntity(
entity =>
{
ShopProduct shopProduct = new ShopProduct
(
entity.Index,
entity.f_shopIndex,
entity.f_listIndex,
entity.f_colorIndex,
entity.f_title,
entity.f_subTitle,
new string[3] { entity.f_slotA, entity.f_slotB, entity.f_slotC },
new float[4] { entity.f_prob_common, entity.f_prob_magic, entity.f_prob_rare, entity.f_prob_legend },
entity.f_price,
entity.f_salePoint
);
shopProducts.Add(shopProduct);
}
);
구글 스프레드 시트 연동
https://www.bansheegz.com/BGDatabase/ThirdParty/GoogleSheets/
스프레드 시트 연동 후 임포트 / 익스포트를 할 수 있습니다. (혹은 오프라인으로 excel과 json도 지원합니다.)
자세한건 위의 링크 내용을 참조하시면 됩니다.
연동이 끝난 뒤, 처음 익스포트나 임포트 해보면 위와 같은 경고창이 뜰텐데,
구글 스프레드시트 API 를 처음사용하는거니 동의가 필요하다는 내용.
해석 그대로 주소에 써진 곳에 접속해서 API 사용버튼을 눌러주면 끝입니다.
구글 스프레드 주의할 점
공통 주의 사항으로 float값은 익스포트를 할 때 '부동 소수점' 이기 때문에 정확한 값으로 내보내지 않고
0.2 -> 0.20000000001 등의 숫자로 내보냅니다.
사실 버그를 발생 시키는 건 아니지만 시트에서 데이터를 수정할 때 조금 불편해집니다.
(float만 있는 경우면 상관없는데, float List 같은 경우 숫자 소수점 생략보기도 안먹힙니다)
때문에 최초에 사용법을 익힐 때 모든 자료형을 익스포트 해놓은 시트를 예시로 만들어 두시고,
이후에는 익스포트를 최대한 하지 않으면서 작업하시면 됩니다.
ID값은 비워져있는경우 자동 채움 기능을 사용하시면 익스포트를 하지않아도 개발이 가능합니다.
새로운 시트를 만들 때에는 다른 시트를 복사해서 이름만 바꿔주면 됩니다.
LiveUpdate
https://www.bansheegz.com/BGDatabase/Addons/LiveUpdate/
구글 스프레드 시트와 연동하여 라이브 업데이트를 지원합니다.
빌드가 된 이후에도 요청을 보내면 데이터시트가 업데이트되는 기능입니다.
하지만 이건 구글 API의 정책문제로 큰 게임에서는 출시 라이브 사용이 불가능합니다.
https://developers.google.com/sheets/api/limits
정책 : 프로젝트 당 100 초당 500 개의 요청, 사용자 당 100 초당 100 개의 요청으로 제한됩니다.
읽기 및 쓰기 제한은 별도로 추적됩니다. 일일 사용 한도는 없습니다.
작은 인디게임이라면 가능한 수준일까 싶지만,
100초당 500개면 동접유저를 100-200정도밖에 수용못하겠죠.
테스트에서는 꽤 유용하게 사용하실 수 있습니다.
'🌍 Unity > 에셋스토어 추천' 카테고리의 다른 글
Build Report / 빌드 후 세부 정보 분석 (0) | 2020.04.11 |
---|---|
Odin - Inspector and Serializer / 유니티 커스텀 인스펙터 (3) | 2020.04.11 |
iOS Project Builder for Windows / 유니티 iOS 빌드 (1) | 2020.02.14 |
DoTweenPRO / 상태 변화 코드 간소화 (0) | 2019.08.25 |
Easy Save / 유니티 데이터 저장 및 암호화 에셋 (1) | 2018.03.29 |