제가 나중에 게임을 개발하다 다루는 데이터가 점점 커질텐데, 언제까지나 유니티내에서 모든 데이터를 저장해놓고 개발하는건 효율적이지도, 제가 추구하는 방향도 아니라고 생각했습니다.
그렇기 때문에 따로 데이터 내용을 저장후 불러올때 아이템으로 불러오는 작업을 하고싶었습니다.
대부분의 경우에는 XML 혹은 JSON포맷을 사용해서 데이터를 주고받습니다. 이전에 JSON을 다뤄본적은 있었으나 그땐 개발공부를 시작한지 3~4개월차 였기때문에 제대로 다뤄보지도못하고 따라만 사용했던 기억이 납니다.
이번에는 CSV포맷을 사용해서 데이터 부분을 구현했습니다.
이 형식으로 가능한지도 몰랐으나, 어느 블로그 글을보면서 매우 쉽게 구현 가능하겠더라고요 그래서 시간이 얼마없었던 저에게 안성맞춤인 방법이었습니다.
우선 Excel을 켜준 후, 저장 하고 싶은 데이터를 입력해줍니다.

저는 아이템 이름, 설명,개수... 뭐 이런식으로 저장했던 기억이나네요 본인만의 원하는 형식으로 저장하면 됩니다.

다음으로 쉼표로분리를 선택해서 저장해주면 정말 데이터가 쉼표로 구분된채 저장됩니다.

그 다음엔 이제 유니티에서 해당 파일을 열어 데이터를 분리해야겠지요 쉼표로 분리되어있으니 당연히 문자열을 쉼표기준으로 쪼개는 함수를 만들어줍니다.
public void ReadCSV()
{
string filePath = Application.dataPath + "/Data/" + itemPath;
// using 블록으로 StreamReader 자동 닫기
using (StreamReader reader = new StreamReader(filePath))
{
bool isFinish = false;
while (isFinish == false)
{
string data = reader.ReadLine(); // 한 줄 읽기
if (data == null)
{
isFinish = true;
break;
}
var splitData = data.Split(','); // 콤마로 데이터 분할
Item item = new Item
{
type = splitData[0],
name = splitData[1],
description = splitData[2],
Count = int.Parse(splitData[3]),
Icon = Managers.Resource.Load<Sprite>($"Icons/{splitData[1]}")
};
itemList.Add(item.name, item);
playerItemList.Add(item);
}
}
}
코드를 보시면 아이템 데이터이면 아이템으로 만들어서 리스트에 넣어준다음 플레이어한테 전달시켰습니다.
그리고 itemList라는 딕셔너리로 저장해둔 아이템을 게임이 종료되거나 저장해야할때 csv에 저장하도록했습니다.
조금 미흡했던거는 수량이 0개면 itemList 딕셔너리에서 지우고 csv에도 아예 사라지게 만들어놨어야했는데 그렇지못한채로 제출해서 좀 아쉽네요
주의 해야할점은 reader나 writer를 사용하기위해서 열었다면 반드시 다시 닫아줘야합니다. 수동으로 안닫아 줘도 using을 사용해서 블록이 끝나면 닫아주는 기능도 있어서 써봤습니다.
만약 수동으로 열고닫으면
public void ReadSkillCSV()
{
string filePath = Application.dataPath + "/Data/" + skillPath;
StreamReader reader = new StreamReader(filePath);
try
{
bool isFinish = false;
while (isFinish == false)
{
string data = reader.ReadLine();
if (data == null)
{
isFinish = true;
break;
}
var splitData = data.Split(',');
Skill skill = new Skill
{
name = splitData[0],
description = splitData[1],
coolTime = float.Parse(splitData[2]),
DMG = float.Parse(splitData[3]),
Icon = Managers.Resource.Load<Sprite>($"Icons/{splitData[0]}")
};
skillList.Add(skill.name, skill);
playerSkillList.Add(skill);
}
}
finally
{
// StreamReader 닫기
reader.Close();
}
}
이렇게 마지막에 닫아줍니다.
불러왔으면 인벤토리 창에 넣어줘야겠지요. 그렇지만 이부분은 저도 제대로 설계하지 않아서 무식한 방법으로 좌측 상단부터 칸을 채우게 설정해놨습니다.
이렇게 해버리면 아이템을 드래그에서 칸을 옮기는 기능을 만들어놔도 인벤토리를 껏다켜면, 다시 좌측상단에 나타난다거나
또 다른 꼼수로 아이템을 전부 사용하면 아이템이 인벤창에서 지워질건데 아이템을 지우는게아니라 칸자체를 지웟다가 새로 아이템 칸을 만들어서 아이템을 지운것처럼 보이게 했습니다...
자세하게 설명하자면 만들고보니 인벤토리 칸에 껌처럼 아이템이 붙어있는 형태가 되어버려 칸 자체를 지워버리는 방향으로 구현했다고 보시면 됩니다.
여기서 배운 개선점은
1. 아이템의 칸 위치도 알고 있어야함
2.아이템을 정말 아이템칸에 들어가있는 하나의 오브젝트 처럼 취급해야지만 아이템을 인벤토리 칸에서 마음대로 분리가 가능할 것
아래는 인벤토리 UI코드 입니다.
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
public class UI_Inven : UI_PopUp
{
public List<Item> myItems = new List<Item>();
public GameObject[] slot = new GameObject[16];
GameObject invenFrame;
enum GameObjects
{
UI_InvenFrame,
UI_Inven_Item
}
private void Start()
{
Init();
}
public override void Init()
{
base.Init();
Bind<GameObject>(typeof(GameObjects));//프리팹에 GameObjects요소들이 담겨있어야 이게작동함
invenFrame = Get<GameObject>((int)GameObjects.UI_InvenFrame);
UpdateInven(invenFrame);
}
//수정사항 3
void UpdateInven(GameObject invenFrame)
{
foreach (Transform child in invenFrame.transform)
Destroy(child.gameObject); // 기존 슬롯 제거
myItems = Managers.Data.GiveData<Item>();
int slotCount = 16; // 슬롯 개수
for (int i = 0; i < slotCount; i++)
{
GameObject itemSlot = Managers.Resource.Instantiate("UI/PopUp/UI_Inven_Item");
itemSlot.transform.SetParent(invenFrame.transform);
if (i < myItems.Count && myItems[i].Count > 0)
{
Item item = myItems[i];
UI_Inven_Item itemUI = itemSlot.GetComponent<UI_Inven_Item>();
if (itemUI != null)
{
// 슬롯 데이터 직접 설정
itemUI.SetItemData(item);
}
}
}
}
}
개인적으로 데이터파트에서 아쉬웠던 부분이 많았던거 같습니다
그래서 이번 프로젝트를 기반으로 문제점들을 정리했고 이젠 시간적 여유도있으니 연습용 프로젝트를 진행하면서 차분히 코드를 짜봐야겠습니다.
다음으로는 사운드 + 신 전환 부분을 소개하고 전반 적으로 기록 못했던 부분을 잘게 나눠서 다뤄보겠습니다.
'Unity' 카테고리의 다른 글
| #2.1 UI 설정 (0) | 2024.12.23 |
|---|---|
| #2 Managers 평가 + UI (0) | 2024.12.23 |
| #1. 기본 세팅 (Unity 프로젝트) (0) | 2024.11.15 |