Node.js와 유니티가 네트워크로 저장값을 받기 위해선 Json이 필요합니다

유니티에 PlayerPrefs 가 있지만 제한적이라서 그렇습니다.

장점으론 간단하고 문제가 자료형이 제한 적이고 변수들을 함수를 각각 써서 하나하나 저장해야함 로컬저장이라서 보안이 취약

 

JSON은 저장 불러올 수 있는 자료형이 다양, 된다면 암호화까지 가능합니다. 또 다른 종류로 xml이 있지만 가독성이 떨어지고 데이터를 가져오고 불러올 때 좀 까다롭습니다.

 

이제부터 JSON으로 저장, 불러오기 기능을 구현해볼 생각입니다.

 

그전에 직렬화 , 역직렬화라는 개념을 알고 가면 좋은것 같아서 영상을 보고 왔습니다.

youtu.be/qrQZOPZmt0w

 

다보고 이제 DB에 어떻게 저장하는지 감이 어느정도 잡히는것 같습니다.

JSON 결국 텍스트 파일이고 이걸 유니티에서 직렬화 해서 JSON(텍스트 파일)으로 저장해서 DB에 적어서 저장하고 불러올때는 DB에 저장된 데이터를 다시 JSON(텍스트 파일)로 만들어 JSON이 유니티로 보내서 역직렬화 해서 불러오는것 같으며 후에 개념이 다시 잡히면 다시 정리하면서 적을것입니다.

 

 

유니티에서 간단하게 Player에 스텟을 JSON으로 변환하고 저장 로드를 만들어봤습니다.

 

Player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class PlayerCtrl : MonoBehaviour
{
    /* PlayerCtrl로서 필요한 변수와 메서드가 있다 */
    public PlayerData playerData;

    // JSON과 플레이어 컨트롤을 같이 써서 사용하지 않고 외부에서 따로 처리하는게 좋다
    // 쉬운 예제이므로 이렇게 사용
    [ContextMenu("To Json Data")]
    void SavePlayerDataToJson()
    {   
        // Json에 저장                       저장값, 가독성 좋게 하기 (true, false)
        string jsonData = JsonUtility.ToJson(playerData, true);
        // 저장 경로       문자열을 확실히 합쳐줌
        string path = Path.Combine(Application.dataPath, "playerData.Json");
        // 실질적 저장(로컬) (경로, 문자열)
        File.WriteAllText(path, jsonData);
    }

    // 로드 해줌
    [ContextMenu("From Json Data")]
    void LoadPlayerDataToJson()
    {
        string path = Path.Combine(Application.dataPath, "playerData.Json");
        // 가져올 데이터 경로
        string jsonData = File.ReadAllText(path);
        // 로드한 값을 덮어씌우기 , 데이터를 불러와서
        playerData = JsonUtility.FromJson<PlayerData>(jsonData);
    }
}
// 직렬화 해줘야 저장이 가능하고 인스펙터창에서 수정이 가능
[System.Serializable]
// 데이터를 가지고 있는 컨테이너와 컨트롤러를 분리하는게 코드가 간결해지며
// JSON에 저장 시 불 필요한 MonoBehaviour의 데이터가 저장됨
public class PlayerData
{
    public string name;
    public int age;
    public int level;
    public bool isDead;
    public string[] item;
}

playerData.Json

{
    "name": "Kim",
    "age": 12,
    "level": 20,
    "isDead": false,
    "item": [
        "Sword",
        "Gun"
    ]
}

만들어보니까 그렇게 어려운게 아니다 바로 포폴에 적응 가능할 정도로 간단했습니다.

하지만 이걸 다시 구름 IDE로 넘겨주고 다시 DB로 역직렬화 해주는걸 해봐야할것 같습니다.

+ Recent posts