-
2024.04.25TIL 2024. 4. 25. 21:46
아이템 배치 및 인벤토리와 도감UI에 이미지 연결 작업까지 마쳤습니다.
인벤토리와 도감에 사용되고 아이템을 얻을 때 나오는 이미지의 종류가 많지 않아서 중복으로 사용해야하는 것들이 많았습니다.
그래서 맵마다 먼저 아이템을 배치해주고 이미지가 중복으로 사용되어야하는 아이템들을 따로 정리해주었습니다.
NOEX_로 어떤 이미지를 사용할 것인지 분리해주고, 같은 이미지를 사용할 아이템들을 나열해봤습니다.
10개가 넘지 않아서 이미지마다 앞자리수를 맞춰주었습니다.
따라서 쪽지 이미지를 사용하는 아이템들의 경우에는 모두 앞자리를 2로 가지고 있습니다.
이렇게 분리를 한 다음에 이미지 적용을 해줍니다.
if (id < 10) { itemImage.sprite = DataManager.Instance.SpriteLoad("Evidence/" + id.ToString()); } else { itemImage.sprite = DataManager.Instance.SpriteLoad("Evidence/" + ((id / 10) * 10).ToString()); }
10 미만인 아이템들은 고유의 이미지를 가지고 있습니다.
10 이상의 아이템들은 이미지를 중복으로 가지고 있습니다.
따라서 itemID가 10 미만일 경우에는 itemID 값에 맞는 이미지를 불러오도록 했으며, 10 이상일 경우에는 10의 자리수에 10을 곱해줌으로써 1의 자리를 0으로 통일시켜서 같은 이미지를 가져올 수 있도록 해주었습니다.
인벤토리의 경우에는 아이템 슬롯과 아이템 정보를 따로 저장해주었습니다. 단, 인덱스 번호는 같게 해주어 슬롯을 클릭했을 때 알맞는 아이템 정보가 나올 수 있도록 했습니다.
SetItemSlot(DataManager.Instance.getItems[DataManager.Instance.getItemsNumber[i]].id); items.Add(DataManager.Instance.getItems[DataManager.Instance.getItemsNumber[i]].id, DataManager.Instance.getItems[DataManager.Instance.getItemsNumber[i]]); nameText.text = items[id].itemData.item_name; descriptionText.text = items[id].itemData.default_description;
SetItemSlot은 아이템을 얻으면 아이템 슬롯을 클릭할 수 있고 슬롯의 이미지를 변경시켜줍니다.
items는 얻은 아이템의 itemID 값을 key, item 정보를 value로 저장해줍니다.
하지만 버튼에 저장되어있는 itemID 값과 슬롯의 index 값이 항상 같을 수는 없습니다.
따라서 아이템을 습득해서 인벤토리에 들어온 것을 세팅해줄 때 파라미터 값을 itemID 값으로 저장해서 동적으로 작동할 수 있도록 설정해주었습니다.
inventorySlots[items.Count].GetComponent<Button>().onClick.AddListener(() => InventorySlotButton(id));
도감의 경우에는 원래는 도감 슬롯 인덱스 값과 itemID를 일치시켜서 순서대로 가져오도록 설정해주었습니다.
그러나 아이템 이미지를 재활용하게 되면서 인덱스 값과 itemID를 일치할 수 없게 되었습니다.
도감의 경우 아이템들마다 고유의 자리가 있습니다. 중간에 어떤 아이템이 없다면 그 아이템의 자리는 비워둬야합니다.
foreach (ItemData item in DataManager.Instance.GetDefaultItemDataList().Data) { if (item.item_id >= 10000) break; if(item.itemType == ItemType.Normal) { if (DataManager.Instance.dogamItemData.ContainsKey(item.item_id)) { if (item.item_id < 10) { itemSlots[i].transform.GetChild(1).GetComponent<Image>().sprite = DataManager.Instance.SpriteLoad("Guide Book/" + item.item_id.ToString()); } else { itemSlots[i].transform.GetChild(1).GetComponent<Image>().sprite = DataManager.Instance.SpriteLoad("Guide Book/" + ((item.item_id / 10) * 10).ToString()); } itemSlots[i].transform.GetChild(1).gameObject.SetActive(true); itemSlots[i].GetComponent<Button>().onClick.AddListener(() => DogamSlotButton(item.item_id)); itemSlots[i].GetComponent<Button>().enabled = true; } i++; } }
도감에서 아이템의 모든 정보를 불러오게 만들고, 그 정보에 따라서 세팅을 해줘야합니다.
GetDefaultItemDataList().Data는 모든 아이템의 정보를 가지고 있는 List입니다.
따라서 dogamItemData와 defaultItemData를 비교해서 가지고 있으면 아이템 슬롯을 세팅해주고 아니라면 i를 증가시켜서 세팅하지 않고 초기 형태를 유지하도록 설정해주었습니다.
인벤토리와 마찬가지로 버튼을 클릭하면 itemID를 통해서 정보를 가져올 수 있도록 설정해주었습니다.
+DataManager.Instance.GetDefaultItemDataList().Data 가 List 형태이므로 for문을 사용하는 것이 편하긴 하지만, 도감에 등록되는 아이템은 아이템 타입이 Normal일 경우에만 등록시킬려고 했습니다.
for문을 이용할 경우에는 아이템 타입이 Normal이 아닌 경우에도 i가 증가하기 때문에 따로 else를 통해서 i의 값이 증가하지 않도록 설정을 해줘야하는 반면, foreach는 아이템 타입이 Normal일 경우에만 i를 증가하게 해주기 때문에 foreach를 선택해주었습니다.
그리고 만약 for문을 사용해서 아이템 타입이 Normal이 아닌 경우 i를 증가시키지 않게 하더라도 DataManager.Instance.GetDefaultItemDataList().Data 를 itemID가 필요한 부분에서 계속 사용하기 때문에 보기 불편한 점도 있습니다.
WebGL로 배포할 예정이기 때문에 보통은 나가기 버튼을 눌렀을 때 StartScene으로 이동한 다음에 웹을 끄도록 유도를 한다고 합니다.
따라서 옵션에 나가기 버튼을 누를 경우 StartScene으로 가도록 설정해주었습니다.
나가기 버튼을 누르거나 저장 버튼을 누를 경우 대화 내역이랑 얻은 아이템들의 정보를 저장할 수 있도록 설정이 따로 필요합니다.
이어하기를 만들려고 했는데 시간이 부족해서 이어하기는 꺼둔 상태입니다.