본문 바로가기
자료

컴공생키우기 자료 - 개인 개발

by 소리쿤 2021. 12. 1.

소스 코드 GitHub Repository ( 전체 시스템 구조도 포함 )

 

https://github.com/solhwi/RaisingStudent

 

GitHub - solhwi/RaisingStudent

Contribute to solhwi/RaisingStudent development by creating an account on GitHub.

github.com

 


 

출시 링크 ( 구글 플레이 스토어 )

 

https://play.google.com/store/apps/details?id=com.EXPstudio.RaisingStudent

 

컴공생키우기 - Google Play 앱

ㅇㅇ대학교 컴퓨터공학과 학생 키우기!

play.google.com

 


플레이어 데이터 저장 및 불러오기

Init

  1. JsonUtiltiy에 초기화한 PlayerData를 넘겨 직렬화한다.
  2. Application.persistentDataPath 안에 경로를 생성한다.
  3. 생성한 경로에 PlayerData.json을 생성한다.
  4. PlayerData.json의 FileStream을 open한다.
  5. JsonUtility를 Byte[] 형태로 만들어 PlayerData.json의 Filestream에 write한다.
  6. 작성된 Json을 Load하여 Scriptable Object에 적용한다. // 주석 부분임

Save

  1. Scriptable을 기반으로 PlayerData를 만들어 위 과정을 수행한다.

Load

  1. Application.persistentDataPath 안에 경로를 생성한다.
  2. 해당 경로 파일의 Filestream을 연다. (PlayerData.json)
  3. Filestream을 read한다.
  4. 읽어들인 byte[] 형태의 데이터를 string 형태의 직렬화된 Json으로 만든다.
  5. JsonUtility를 통해 해당 json을 PlayerData()의 형태로 바꾼다.
  6. 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

 

  1. Excel 시트에 퀘스트 데이터를 작성합니다.
  2. 아래 링크의 js로 작성된 변환기에서 추출될 json 경로를 Resource 폴더로 변경합니다.
  3. 변환합니다.

https://github.com/coolengineer/excel2json

 

GitHub - coolengineer/excel2json: Excel to JSON converter. Structured data (e.g. game design) from non-technician can be easily

Excel to JSON converter. Structured data (e.g. game design) from non-technician can be easily converted to JSON file for programmer. - GitHub - coolengineer/excel2json: Excel to JSON converter. Str...

github.com

 

  1. 변환된 json을 json utility를 이용하여 QuestData 형태로 변환합니다.
  2. 사용처에 따라 적절히 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;
}