유니티
[C#] 외부 데이터(CSV 파일)
simstealer
2022. 8. 5. 14:26
1. Assets 폴더 내 Resources 폴더 생성 및 CSV파일 만들기
2. .json 파일로 불러 오기
// .json 확장자를 가진 변수
public string GameDataFileName = ".json";
[Header("몬스터 관련 DB")]
// TextAsset은 불러오는 것이고 monsterDB라는 이름으로 데이터를 불러온다.
[SerializeField] TextAsset monsterDB;
3. Dictionary 타입의 데이터를 저장할 변수 생성
// <인덱스, 데이터>를 받는 MonsterDataDict 이름의 변수
public Dictionary<int, MonsterData> MonsterDataDict { get; set; }
4. 데이터를 담을 클래스 생성
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;
}
}
5. CSV의 데이터를 가공해서 MonsterDataDict에 넣는다
private void SetMonsterDataFromCSV()
{
// 리소스 폴더안의 CSV파일을 로드
monsterDB = Resources.Load<TextAsset>("CSV/GameData - Monster");
// 파일이 없으면 null 이 저장됨
if (monsterDB == null)
{
Debug.LogError("CSV/MonsterData.csv 파일 없음.");
return;
}
// 데이터을 담을 공간 확보
if (MonsterDataDict == null)
{
MonsterDataDict = new Dictionary<int, MonsterData>();
}
// 0 번째 부터 텍스트 길이까지 줄바꿈을 기준으로 자른다
// 자른 데이터는 스트링 배열로 들어 오기때문에 스트링 배열로 받아야 한다
string[] lines = monsterDB.text.Substring(0, monsterDB.text.Length).Split('\n');
for (int i = 1; i < lines.Length; i++) // 0번은 컬럼 명이라 1번부터 시작한다
{
// 줄바꿈을 기준으로 자른 데이터를 쉼표 기준으로 다시 자른다
string[] row = lines[i].Split(',');
// 자른 값을 넣는 작업
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]), // rotationSpeed
row[4] // description
)); // float.Parse() 는 데이터를 float 타입으로 바꾼다
}
}
6. 게임 오브젝트 생성
// 게임 오브젝트를 저장할 변수 container
static GameObject container;
static GameObject Container { get => container; }
// { get => container; }의 의미는 값을 get해줄 때, container의 값을 준다.
// 생성된 게임 오브젝트에 DataMgr스크립트 넣기
static DataMgr instance;
//
public static DataMgr Instance
{
get
{
// instance 변수에 게임 오브젝트가 없으면
if (instance == null)
{
// DataMgr의 이름을 가진 게임 오브젝트를 생성하고
container = new GameObject();
container.name = "DataMgr";
// DataMgr 타입의 컴포넌트 추가
instance = container.AddComponent(typeof(DataMgr)) as DataMgr;
//
instance.SetMonsterDataFromCSV();
// 씬이 넘어가도 해당 게임 오브젝트는 살아 있는다.
DontDestroyOnLoad(container);
}
return instance;
}
}
7. 사용할 수 있게 Get 메소드 만들기
public MonsterData GetMonsterData(int index)
{
// Key 값을 넣으면 Data 값을 Return
if (MonsterDataDict.ContainsKey(index))
{
return MonsterDataDict[index];
}
Debug.LogWarning(index + "해당 인덱스 데이터가 없음");
return null;
}
8. 다른 클래스에서 사용하기
private void Awake()
{
// MonsterData 타입의 변수를 하나 만들고 인덱스를 넣어 데이터를 저장하고
// 저장한 값을 관련한 변수에 대입하여 실제 값을 바꿈
MonsterData data = DataMgr.Instance.GetMonsterData(2);
moveSpeed = data.moveSpeed;
rotationSpeed = data.rotationSpeed;
}