코딩/유니티

[유니티] CSV 데이터 저장

Hun die 2022. 8. 5. 11:39

 

CSV 테스트를 위해 적당히 데이터 만듬

1. 만든 CSV는 Resources 폴더(폴더 만들어야 함)에 넣는다.

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

//몬스터의 데이터를 저장하는 구조체
public class MonsterData
{
    public int index;
    public string name;
    public float moveSpeed;
    public float rotationSpeed;
    public string description;

    public MonsterData(int index, string name, float moveSpeed, float rotationSpeed, string description)
    {
        this.index = index;
        this.name = name;
        this.moveSpeed = moveSpeed;
        this.rotationSpeed = rotationSpeed;
        this.description = description;
    }
}

public class DataManager : MonoBehaviour
{

    //데이터를 넣을 컨테이너를 먼저 만듬
    static GameObject container;

    //get => container 는 외부에서 get 하면 container 값을 대신 준다는 뜻
    static GameObject Container { get => container; }

    static DataManager instance;

    public static DataManager Instance
    {
        get
        {
            if (instance == null)
            {
                container = new GameObject();
                container.name = "DataManager";
                instance = container.AddComponent(typeof(DataManager))as DataManager;

                instance.SetMonsterDataFromCSV();

                DontDestroyOnLoad(container);
            }
            return instance;
        }
    }

    public string GameDataFileName = ".json";

    [Header("몬스터 DB")]
    [SerializeField] TextAsset monsterDB;

    //구조체로 하나의 메모리로 통합시킴(MonsterData는 구조체)
    public Dictionary<int, MonsterData> MonsterDataDict { get; set; }

    private void SetMonsterDataFromCSV()
    {
        //리소스 폴더에 있는 SCV를 불러옴
        monsterDB = Resources.Load<TextAsset>("SCV/GameData - Monster");

        if (monsterDB ==null)
        {
            Debug.LogError("SCV/GameData - Monster 파일이 없음");
            return;
        }
        //MonsterDataDict에 저장 공간을 만들어줌
        if (MonsterDataDict == null)
        {
            MonsterDataDict = new Dictionary<int, MonsterData>();
        }

        //스트링 단위로 쪼갬
        string[] lines = monsterDB.text.Substring(0, monsterDB.text.Length).Split('\n');

        //0은 필요없는 데이터라 넘어감(설명)
        for (int i = 1; i < lines.Length; i++)
        {
            string[] row = lines[i].Split(',');
            //데이터 수 만큼 넣음 Parse으로 스트링 값을 바꿈
            MonsterDataDict.Add(int.Parse(row[0]), new MonsterData(
                int.Parse(row[0]),          // index
                row[1],                     // name
                float.Parse(row[2]),        // moveSpeed
                float.Parse(row[3]),        // retationSpeed
                row[4]                      // description
                )); 
        }
    }
    
    //index 번호의 몬스터를 부르는 함수로 불러서 사용
    public MonsterData GetMonsterData(int index)
    {
        Debug.Log($"몬스터 정보 호출 index : {index}");
        //ContainsKey는 해당 키를 가진 주소를 확인한다.
        if ( MonsterDataDict.ContainsKey(index))
        {

        }

        Debug.Log("해당 index의 데이터가 없습니다.");
        return null;
    }
}

 

Parse = 스트링 값을 다른 값으로 바꾼다.

ex : int.Parse("String") = String 값이 int 값이 됨

이런 식으로 값을 불러와서 사용한다.