소스 코드 GitHub Repository ( 전체 시스템 구조도 포함 )
https://github.com/solhwi/RaisingStudent
출시 링크 ( 구글 플레이 스토어 )
https://play.google.com/store/apps/details?id=com.EXPstudio.RaisingStudent
플레이어 데이터 저장 및 불러오기
Init
- JsonUtiltiy에 초기화한 PlayerData를 넘겨 직렬화한다.
- Application.persistentDataPath 안에 경로를 생성한다.
- 생성한 경로에 PlayerData.json을 생성한다.
- PlayerData.json의 FileStream을 open한다.
- JsonUtility를 Byte[] 형태로 만들어 PlayerData.json의 Filestream에 write한다.
- 작성된 Json을 Load하여 Scriptable Object에 적용한다. // 주석 부분임
Save
- Scriptable을 기반으로 PlayerData를 만들어 위 과정을 수행한다.
Load
- Application.persistentDataPath 안에 경로를 생성한다.
- 해당 경로 파일의 Filestream을 연다. (PlayerData.json)
- Filestream을 read한다.
- 읽어들인 byte[] 형태의 데이터를 string 형태의 직렬화된 Json으로 만든다.
- JsonUtility를 통해 해당 json을 PlayerData()의 형태로 바꾼다.
- Scriptable Object에 적용한다. // 주석 부분임
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
// PlayerData를 관리하는 스크립트입니다.
// (2) DataSyn Functions : Persis -> Cache / Cache -> Persis
public class PlayerDataMgr
{
public static PlayerData_SO playerData_SO = Resources.Load<PlayerData_SO>("PlayerData_SO");
#region PUBLIC METHODS
// 첫 플레이 시, 플레이어 데이터를 첫플레이에 맞게 초기화합니다.
public static void Init_PlayerData()
{
PlayerData data = new PlayerData();
string JsonData = JsonUtility.ToJson(data, true);
string path = GetPathFromSaveFile();
using (FileStream stream = File.Open(path, FileMode.Create))
{
byte[] byteData = Encoding.UTF8.GetBytes(JsonData);
stream.Write(byteData, 0, byteData.Length);
stream.Close();
Sync_Persis_To_Cache();
Debug.Log("PlayerDataMgr: INIT COMPLETE - " + path);
}
}
public static void Sync_Persis_To_Cache()
{
PlayerData playerPersisData;
string path = GetPathFromSaveFile();
using (FileStream stream = File.Open(path, FileMode.Open))
{
byte[] byteData = new byte[stream.Length];
stream.Read(byteData, 0, byteData.Length);
stream.Close();
string JsonData = Encoding.UTF8.GetString(byteData);
playerPersisData = JsonUtility.FromJson<PlayerData>(JsonData);
}
// PlayerData-to-add
// Player Data에 추가되는 항목은 여기에도 추가하세요.
Debug.Log("PlayerDataMgr: PLAYER_DATA (PERSIS->CACHE) COMPLETE \n " + path);
}
public static void Sync_Cache_To_Persis()
{
PlayerData playerPersisData = new PlayerData();
// PlayerData-to-add
// Player Data에 추가되는 항목은 여기에도 추가하세요.
string JsonData = JsonUtility.ToJson(playerPersisData, true);
string path = GetPathFromSaveFile();
using (FileStream stream = File.Open(path, FileMode.Create))
{
byte[] byteData = Encoding.UTF8.GetBytes(JsonData);
stream.Write(byteData, 0, byteData.Length);
stream.Close();
Debug.Log("PlayerDataMgr: PLAYER_DATA (CACHE->PERSIS) COMPLETE \n " + path);
}
}
// 플레이어데이터가 있는지 없는지. => 보통 Init_PlayerData() 하기전에 검사용
public static bool isPlayerDataExist()
{
if (File.Exists(GetPathFromSaveFile())) return true;
else return false;
}
#endregion
#region PRIVATE METHODS
// Helper Function
private static string GetPathFromSaveFile()
{
return Path.Combine(Application.persistentDataPath, "PlayerData.json");
}
#endregion
}
퀘스트 Excel to Json, Json to Scriptable Object
- Excel 시트에 퀘스트 데이터를 작성합니다.
- 아래 링크의 js로 작성된 변환기에서 추출될 json 경로를 Resource 폴더로 변경합니다.
- 변환합니다.
https://github.com/coolengineer/excel2json
- 변환된 json을 json utility를 이용하여 QuestData 형태로 변환합니다.
- 사용처에 따라 적절히 Scriptable Object에 적재합니다.
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
public class QuestDataMgr
{
public static QuestData LoadSingleNormalQuestData(int questIdx)
{
string jsonFileName = "questData/NormalQuestData-" + questIdx.ToString();
TextAsset jsonData = Resources.Load<TextAsset>(jsonFileName);
Debug.Log("NormalQuestData: SINGLE NORMAL_QUEST_DATA LOAD COMPLETE");
return JsonUtility.FromJson<QuestData>(jsonData.ToString());
}
public static QuestDataContainer LoadSingleMainQuestData()
{
string jsonFileName = "questData/MainQuestData";
TextAsset jsonData = Resources.Load<TextAsset>(jsonFileName);
Debug.Log("MainQuestData: SINGLE NORMAL_QUEST_DATA LOAD COMPLETE");
return JsonUtility.FromJson<QuestDataContainer>(jsonData.ToString());
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class QuestDataContainer
{
public List<QuestData> mainQuestDatas = new List<QuestData>();
public QuestDataContainer()
{
mainQuestDatas.Add(new QuestData());
}
}
[System.Serializable]
public class QuestData
{
// quest에 대한 정보를 담고 있음, quest의 이름과 quest와 관련된 npc
public int QuestId;
public string QuestName;
public string QuestDescription;
public List<TalkData> QuestContext;
}
[System.Serializable]
public class TalkData
{
public int ObjId;
public string ObjName;
public string ItemForTalk; // 말을 걸기 위해 필요한 아이템
public string[] TalkContext;
public string ItemCodeReward;
public int GoldReward;
public int LikeReward;
}
'자료' 카테고리의 다른 글
[자료] 수상하지만 괜찮은 사이트 (0) | 2022.08.28 |
---|---|
[자료] 노멀 매핑과 테셀레이션 의미 (0) | 2022.06.21 |
[Discord] 훅 설정 (0) | 2022.03.10 |
Mini Kingdom 자료 - 2021 홍익대학교 졸업 프로젝트 (0) | 2021.12.01 |
Flick 자료 - 2020 스마일게이트 챌린지 2 (0) | 2021.12.01 |