엑셀 파일에 데이터를 넣은 후 메모장에 복사한다.

엑셀파일에 몬스터 데이터를 넣고

엑셀파일에 몬스터 데이터를 넣고

복사 붙여넣기를 하면 이렇게 바뀐다.

복사 붙여넣기를 하면 이렇게 바뀐다.

매번 텍스트 파일을 수정하는 것이 아니라 엑셀 파일 수정 후 복사만 하면 되기 때문에 이 방법을 채택하였다.

아래의 유튜브 영상을 참고하였다.

https://www.youtube.com/watch?v=GNSD1-y6SeM&t=1205s

아래는 위 영상을 바탕으로 짠 코드이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using System.IO;
using System.Text;
using System;

[System.Serializable]
public class Monster //몬스터 객체 생성
{
    public Monster(string _ID, string _Type, string _Name, string _HP, string _ATK, string _Type_A, string _Type_D)
    { ID = _ID; Type = _Type; Name = _Name; HP = _HP; ATK = _ATK; Type_A = _Type_A; Type_D = _Type_D; }

    public string ID, Type, Name, HP, ATK, Type_A, Type_D;
}

public class MonsterStat : MonoBehaviour
{
    [HideInInspector]
    public string jsondata; //데이터를 담을 문자열
    public List<Monster> Monsters; //txt to json에 사용할 리스트
    public static List<Monster> Monsters_d; //json to object에 사용할 리스트

    void CreateJsonFile(string createPath, string fileName, string jsonData)
    {
        FileStream fileStream = new FileStream(string.Format("{0}/{1}.json", createPath, fileName), FileMode.Create); //json파일 생성
        byte[] data = Encoding.UTF8.GetBytes(jsonData); //문자열을 utf8 방식으로 인코딩함 (텍스트파일로 저장하기 위해서)
        fileStream.Write(data, 0, data.Length); //data를 json파일에 저장
        fileStream.Close();
    }

    T LoadJsonFile<T>(string loadPath, string fileName)
    {
        FileStream fileStream = new FileStream(string.Format("{0}/{1}.json", loadPath, fileName), FileMode.Open); //읽을 json파일을 불러옴
        byte[] data = new byte[fileStream.Length];
        fileStream.Read(data, 0, data.Length);
        fileStream.Close();
        string jsonData = Encoding.UTF8.GetString(data); //읽은 데이터를 utf8 방식으로 인코딩
        return JsonUtility.FromJson<T>(jsonData); //데이터를 반환
    }

    void Save()
    {
        string jsondata = JsonConvert.SerializeObject(Monsters); //Monsters(몬스터데이터가 담긴 리스트)를 직렬화 시켜서 문자열에 저장함(json으로 저장하기 위해선 꼭 직렬화가 필요함)
        File.WriteAllText(Application.dataPath + "/Resources/MonsterStat.json", jsondata);
    }

    void Load()
    {
        string jsondata = File.ReadAllText(Application.dataPath + "/Resources/MonsterStat.json");
        Monsters_d = JsonConvert.DeserializeObject<List<Monster>>(jsondata); //json파일에서 긁어온 데이터를 Monster_d 리스트에 저장
    }

    void Awake()
    {
        TextAsset MonsterDatabase = Resources.Load<TextAsset>("MonsterData"); //Resources폴더에 있는 MonsterData.txt를 TextAsset화 시켜서 불러옴
        string[] line = MonsterDatabase.text.Substring(0, MonsterDatabase.text.Length - 1).Split('\\n'); //Excel 파일을 붙여넣기 하는 과정에서 맨 아랫줄에 저절로 빈 줄이 생기므로 빈 줄을 제거하고, 띄어쓰기를 제거함
        for(int i = 0; i < line.Length; i++)
        {
            string[] row = line[i].Split('\\t'); //text 간에 공백을 제거하여 파싱함
            Monsters.Add(new Monster(row[0], row[1], row[2], row[3], row[4], row[5], row[6])); //파싱한 문자열 배열을 바탕으로 몬스터 객체를 생성하여 몬스터 리스트에 넣음
        }

        Save();

        Load();
    }
}

<aside> 💡

ID, Type, Name 등과 같은 데이터는 필요할 지 잘 모르겠다. ID의 경우 일단은 리스트의 번호와 기능이 크게 차이가 없고, Type의 경우엔 지금으로선 Tag를 정해주는 정도로만 사용되고 있다. Name또한 생성(복제)될 때 복제된 오브젝트의 이름으로 사용되는 정도이다. 생성(복제)될 때에 데이터를 가져오는 방식으로도 Name을 사용하긴 했지만 임시로 사용하였고, 수정할 때엔 아마 원본 프리팹에 ID를 넣어놓은 뒤에 ID를 검사하여 데이터를 뽑아오는 것도 괜찮을 것 같다.

</aside>

<aside> ⚠️ JavaScript Object Notation (JSON)은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷입니다. 웹 어플리케이션에서 데이터를 전송할 때 일반적으로 사용합니다(서버에서 클라이언트로 데이터를 전송하여 표현하려거나 반대의 경우) 출처 : https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/JSON

</aside>

내가 사용한 후 느낀 JSON은 내가 저장할 데이터를 주르륵 나열하여 저장하는 것인데, 데이터마다 내가 정해준 이름이 붙어있어서 그 이름을 호출하면 거기에 할당된 값이 튀어나오는 것이라고 생각한다. 근데 이제 저장하는 방식이 html 또는 javascript와 비슷해서 꺼내 올 때는 파싱을 통해 꺼내오면 되고, 저장할 때는 내가 저장할 객체들의 데이터를 문자열화 시켜서 저장하는 느낌? 뭔가 글로 설명하자니 어려운 것 같다.