1 2 3 4 5 6 7 8 9 10 11 | public class ItemData { public Item item; // 획득한 아이템 public int itemCount; // 획득한 아이템의 개수 public void AddItem(Item _item, int _count = 1) { item = _item; itemCount = _count; } } | cs |
우선 ItemData 라는 클래스를 만들었음.
가상의 슬롯? 역할을 할거임. 아이템 클래스, 아이템 개수가 저장됨.
(아이템 클래스엔 아이템 이름, 종류 등등이 담겨있음)
AddItem 함수로 아이템을 할당할 수 있음.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class InventoryManager : MonoBehaviour { public ItemData[] itemData = new ItemData[12]; // Start is called before the first frame update void Start() { for (int i = 0; i < itemData.Length; i++) { itemData[i] = new ItemData(); } GetItem(Resources.Load<Item>("Items/itemTallow"), 4); } public void GetItem(Item _item, int _count = 1) { for (int i = 0; i < itemData.Length; i++) { if (itemData[i].item == null) { itemData[i].AddItem(_item, _count); } } } } | cs |
그리고 인벤토리 매니저
ItemData를 배열로 선언함. 크기는 일단 12개로 지정해줬음.
클래스를 배열로 선언하려면 for문 돌면서 new 선언 해줘야한대서 했음 (안하니까 null 포인터 에러나더라. 원리는 잘 모름. 구글링해서찾음)
GetItem 함수는 아직 미완인데 일단 비어있는 슬롯에 아이템 데이터를 담게끔 만들었어
이제 획득한 아이템 데이터가 가상의 공간에 담겨있으니까
이후 각종 인벤토리 UI에서 저 배열 찾아다가 그대로 쓰면 되겠지?
왜 이렇게 만들었는지 이해가 안가. 데이터를 설계할때는 DB 구조를 생각하는게 여러모로 좋아. DB를 쓰지않더라도 그편이 리스트를 다루거나 LINQ를 쓰기 좋고. 후에 서버로 확장할거 생각하면 데이터 구조를 바꾸지 않아도 되고(데이터 구조가 바꾸면 모든 로직이 바뀌어야함).
class InventoryManager { Item[] itemList; }
class Item { public string Name {get;set;} public ItemType Type {get;set;} // ItemType은 enum public int Count {get;set;} }
나라면 이런식으로 데이터 구조를 잡을 것같네
엑셀파일로 생각하면 Item 시트(테이블)에 Item 인스턴스 하나하나가 각각의 행(row)가 되고 프라퍼티들이 각각의 열(칼럼)이 되는거지.
item 클래스에 count 변수가 담겨있으면 헷갈릴거같았음. 그래서 itemData라는 아이템, 개수 담는 시트를 따로 만들어놓은것
일단 GetItem 메서드의 동작과 그 용례가 맘에 안듦. 어쩌면 너가 의도한 동작이 내가 생각하는 메서드가 아닌지도 모르겠어.. Get이 붙으면 Getter를 말하는게 일반적인데 어째서 addItem 같은 setter 행위를 하는가야. 그걸 호출한 Start 메서드에서도 의문이야. GetItem의 동작은 분명 Setter인데 Resources.Load 하는 이유가 뭐야? Item 클래스 인스턴스는 분명 '인스턴스'인데 파일을 불러와서 집어넣는 이유는 뭐야. 그게 들어가? 스크립터블 오브젝트인가? 아니 애초에 인벤토리 리스트에 그렇게 넣는 이유를 모르겠어.
뭐 이건 내가생각하는 Get과 너가 생각하는 Get이 다른거라고 생각이 된다.
원래 ui에 할당하던 코드를 바꾸는 과정에서 그리된듯. 아이템은 스크립터블 오브젝트임. 상세한 답변 고맙다 답변준대로도 해봐야겠음
그렇게 하면 데이터 존나 꼬여. 스크립터블 오브젝트 때문인가 본데 , 스크립터블 오브젝트 Item 클래스 멤버에 Count 도 그냥 포함시켜. 초기값 0으로 통일. 유저의 데이터인데 (스크립터블은 정해놓은 정보고)Count는 변하는값이라 거기에 넣는게 의미는 없는데 굳이 스크립터블 쓰겠다면 그편이 나아보인다.
아이템마다 Count 값은 (유저정보)는 어찌되었든 다른 저장공간(파일이든 DB든)이 필요함. 어차피 아이템정보와 획득정보를 Data클래스로 메모리에 올려야하는데 스크립터블도 로드해서 정보를 넣고, count 정보도 로드해서 넣어야지. 너는 지금 그 두개를 별도로 해서 넣는 방법을 택한가지만 그냥 Data 인스턴스 멤버와 SO 멤버를 1:1 매칭시키는게 나을거야. SO를 로드하면서 count정보를 불러와서 SO.count 값을 변경해. 그럼 data인스턴스 = SO인스턴스 처럼 1:1로 할당이 가능하겠지.
그래서 이럴바엔 그냥 csv 나 DB 쓰는게 깔끔하다.