#이번 글은 확실하지 않은 주관적인 정보입니다.
1. Zep 스토리지
Zep에서는 데이터를 저장 할 수 있는 클라우드 스토리지를 지원한다.
각 스페이스별 및 각 플레이어별 스토리지가 존재하며, 해당 데이터들은 Zep을 종료한 후, 접속을 종료한 후, 앱을 업데이트한 후 재배포시에도 삭제되지 않는다.
Zep에서 스코어에 따른 랭킹판이나, 플레이어 데이터를 저장 후 이후 플레이시에도 지장없도록 구현하기위해 연구한 결과 아래 이미지와 같은 구조로 추측된다.
- 스페이스 하나당 스페이스 하나의 스토리지가 존재한다
- 스페이스 스토리지에는 각 앱의 데이터를 저장할 수 있다.
- 노멀 앱끼리의 데이터는 서로 참조가 불가능하다
- 하나의 맵은 하나의 노말앱을 할당할 수 있다.
- 각맵에 할당된 앱이 동일한 노말 앱인 경우, 다른맵에서 설정된 데이터를 참조할 수 있다.
- 각맵에 할당된 앱이 다른 노말 앱인 경우, 다른 맵에서 설정된 데이터를 참조할 수 없다.
- 플레이어 스토리지도 동일한 형태로 저장이 된다.
따라서 스페이스 하나에 선형적인 구조로 맵을 작성하고, 이전맵에서 설정된 데이터를 참조하기 위해서는 스페이스 하나에 하나의 노말앱으로 프로그램을 작성하고, 모든 맵에 동일한 노말 앱을 할당 해야한다.
2. 동일한 앱으로 맵마다 다른 기능 설정하기
Zep 에는 맵 해시라는 것이 존재한다.
맵 에디터에서 맵을 추가하고, 맵을 편집하게 되는데, 에디터창 url의 맨 끝에 맵 해시코드가 적혀있다.
해당 맵의 해시코드를 적어두고, 라이프사이클에 따라서 특정 맵에서 init, joinplayer가 실행될 때 맵의 해시코드에 따라서 실행될 코드를 분할해 주면 된다.
const mapHash_1: string = "MapHash1";
const mapHash_2: string = "MapHash2";
ScriptApp.onInit.Add(function () {
#현재 맵의 해시값 불러오기
var curMapHash = ScriptApp.mapHashID;
if (MapHash1.includes(curMapHash)) {
#function
}
if (MapHash2.includes(curMapHash)){
#function
}
});
맵들의 해시값은 다르나, 동일한 함수를 사용해야 하는 경우가 있다면 맵 해시를 string배열로 설정하면 된다.
const mapHash_1: string[] = ["MapHash1-0", "MapHash1-1"];
const mapHash_2: string[] = ["MapHash2-0", "MapHash2-1"];
ScriptApp.onInit.Add(function () {
#현재 맵의 해시값 불러오기
var curMapHash = ScriptApp.mapHashID;
if (MapHash1.includes(curMapHash)) {
#function
}
if (MapHash2.includes(curMapHash)){
#function
}
});
위 코드를 응용하여 Zep에서 지원하기 까다로운 Localize(다국어 지원)도 쉽게 적용할 수 있다.
3. 스토리지 참조
기본적으로 Zep에서 스토리지는 string 값을 사용한다.
하지만 string으로 모든 데이터를 분류하고 다루기에는 무리가 있으므로 json형식으로 데이터를 다루고, 저장시엔 stringify를 이용하여 string으로 저장하는 형태를 사용한다.
//맵에 플레이어가 입장하면 해당 플레이어 정보가 함수의 필드가 된다.
ScriptApp.onJoinPlayer.Add(function (player){
//플레이어 데이터가 null이면
if (player.storage == null) {
//json 템플릿을 가져와서
var jsonTemp = getJsonTempStr();
//플레이어 스토리지 값으로 할당하고
player.storage = jsonTemp;
//서버에 저장한다.
player.sendUpdated();
player.save();
} else {
}
});
//userDat
//유저 데이터 json 저장 템플릿
function getJsonTempStr() {
var temp = {
score: 0,
userLang: 0,
};
var json = JSON.stringify(temp);
return json;
}
//score
//유저 스코어 가져오기
function getPalyerScore(player: ScriptPlayer): number {
var playerDat = JSON.parse(player.storage);
var palyerScore = playerDat.score;
return palyerScore;
}
//유저 스코어 저장
function setPlayerScore(player: ScriptPlayer, scoreUpdate: number) {
var playerDat = JSON.parse(player.storage);
playerDat.score = scoreUpdate;
player.storage = JSON.stringify(playerDat);
player.save();
}
유저정보나 스페이스에 저장되는 정보들은 동일한 형태로 저장 및 참조한다
위 방식을 이용해서 Zep에서 구현하기 까다로운 Localize(다국어 지원)도 적용할 수 있다.
하지만 모든 값을 Localize로 적용하기에는 코드에 제약도 많고 용량도 늘 수 있으므로, Alert나 toast message같은 형태 또는 반드시 변수를 받아서 알려줘야하는 소량의 텍스트만 코드에서 구현하고 나머지는 맵에서 설정하는 것이 좋다.
Localize는, 지원할 언어 갯수만큼 맵을 복제하고, 지원할 순서에 맞게 맵 해시값을 가지고 온다.
언어는 설정할 맵에 입장을 하면 세팅하고, 순차적으로 이어지는 맵에서는 세팅할 필요가 없다.
앞에서 언급했던, 다른맵이 같은 기능을 하는 경우가 다국어 지원을 적용할때 발생한다.
//0번맵 - 한국어, 1번맵 - 영어
const mapHash_1: string[] = ["mapHash_1_ko", "mapHash_1_en"];
//AlertTexts
const alertTxt: string[] = [
"언어 설정 - 한국어",
"Language setting - english",
];
//맵에 플레이어가 입장하면 해당 플레이어 정보가 함수의 필드가 된다.
ScriptApp.onJoinPlayer.Add(function (player){
//플레이어 데이터가 null이면
if (player.storage == null) {
//json 템플릿을 가져와서
var jsonTemp = getJsonTempStr();
//플레이어 스토리지 값으로 할당하고
player.storage = jsonTemp;
//서버에 저장한다.
player.sendUpdated();
player.save();
} else {
}
//현재 맵의 해시값을 가져온다.
var curMapHash = ScriptApp.mapHashID;
//유저 언어를 세팅한다.
//mapHasg_1에 현재 맵 해시의 인덱스를 가져온다(존재하지 않는 경우 -1을 반환하게 된다
//오류 방지를 위해 배열에 존재하는지 여부를 먼저 확인한다
if (mapHash_1.includes(curMapHash)) {
mapHash_1(player, mapHash_Convayer.indexOf(curMapHash));
}
});
//userDat
//유저 데이터 json 저장 템플릿
function getJsonTempStr() {
var temp = {
score: 0,
userLang: 0,
};
var json = JSON.stringify(temp);
return json;
}
//Language
//유저 언어를 가져온다
function getPlayerLanguage(player: ScriptPlayer) {
var playerDat = JSON.parse(player.storage);
var userLang = playerDat.userLang;
return userLang;
}
//유저 언어를 설정한다.
//언어 설정시 언어 번호는 언어 설정을 하게될 맵의 인덱스로 설정하는것을 추천한다.
function setPlayerLanguage(player: ScriptPlayer, lang: number) {
var playerDat = JSON.parse(player.storage);
playerDat.userLang = lang;
player.storage = JSON.stringify(playerDat);
player.sendUpdated();
player.save();
//언어 설정완료시 설정된 언어로 모두에게 말하기
ScriptApp.sayToAll(`${alterTxt[getPlayerLanguage(player)]}`);
}
'Code > Zep' 카테고리의 다른 글
Zep 개발 가이드 #02 배포 (0) | 2024.07.18 |
---|---|
Zep 개발 가이드 #01 기본 라이프 사이클 (0) | 2024.07.08 |
Zep 개발 가이드 #00 Zep 설치 (0) | 2024.07.08 |