-
오예~!
원하는 부분을 어떻게 해결했습니다 ... ㅠ
1차 제출은 해결못해서 다른 프로젝트를 만들어서 제출하고..
이렇게라도 해결해서 다행입니다.. ㅠ
잊기 전에 적는 아이템 인벤토리에 넣는 방법!
기본적으로 인벤토리 슬롯에는 아이템이 없는 상태입니다.
1. 테스트 기본 설정
public GameObject inventorySlotF; [HideInInspector] public GameObject[] inventorySlots; public Item testItem; private void Start() { inventorySlots = new GameObject[inventorySlotCount]; inventory.MakeInventorySlot(inventorySlotCount); inventory.ItemInInventory(testItem); }
인벤토리 슬롯은 프리팹으로 만들어주었으며,
Grid Layout Group을 사용하면 원하는 갯수만큼 행 또는 열을 지정해서 column X row 로 세팅해줍니다.
생성 순서 또한 정할 수 있습니다.
2. 인벤토리 슬롯 생성
GameObject newSlot = Instantiate(GameManager.instance.inventorySlotF); newSlot.transform.parent = slotsParent.transform; GameManager.instance.inventorySlots[i] = newSlot; check_item[i] = false; inventoryItem[i] = null;
원하는 갯수만큼 인벤토리 슬롯을 생성해줍니다.
처음 생성 시 아이템이 없기 때문에 인벤토리 아이템을 null로 설정해줍니다.
나중에 슬롯에 아이템이 있다면 사용했을 때 적용시켜주기 위해서 인벤토리 슬롯 GameObject와 Item을 배열로 만들어서 같은 인덱스를 사용할 때 서로의 값을 가져올 수 있게 설정해줍니다.
3. 인벤토리 아이템 넣기
if (inventoryItem[i] == null) { inventoryItem[i] = item; check_item[i] = true; GameManager.instance.inventorySlots[i].transform.Find("UnEquip/item").GetComponent<Image>().sprite = inventoryItem[i].itemData.itemImage; GameManager.instance.inventorySlots[i].transform.Find("UnEquip/item").gameObject.SetActive(true); break; }
인벤토리에 아이템이 없다면 아이템을 넣어줍니다.
마찬가지로 같은 인덱스에 위치하는 인벤토리 슬롯에 아이템 이미지를 넣어주면서 아이템이 들어가 있음을 게임 화면으로 보여줍니다.
☆ 아이템 설정
public Item(ItemData itemData) { attack = itemData.attack; defense = itemData.defense; critical = itemData.critical; health = itemData.plus_health; equip = false; }
아이템 데이터를 만들어서 아이템에 설정한 데이터를 넣어줍니다.
아이템은 아이템별로 고유의 값이 있습니다.
아이템 오브젝트를 생성해서 Item을 넣어주고 아이템 오브젝트에 맞는 아이템 데이터를 넣어줍니다.
이러면 아이템을 인벤토리에 넣어주기 끝!
+Resources 사용법
Resources.Load<GameObject>("Resources 하위 폴더명/사용할 GameObject 이름"); -> prefab 불러오기 좋음.
GameObject가 아니라면 < > 내용을 바꿔주면 됨.
인벤토리에 있는 아이템 정보 가져오는 법
슬롯을 Prefab으로 생성해줬기 때문에 버튼을 클릭할 때 매개변수를 다른 값으로 받을 수 있도록 설정이 필요합니다.
1. script -> unity 매개변수 이동.
for(int i = 0; i < inventoryItem.Length; i++) { int n = i; GameManager.instance.inventorySlots[i].GetComponent<Button>().onClick.AddListener(() => OnSelectSlot(n)); }
이 부분은 인벤토리 슬롯이 모두 생성되고 실행시켜줍니다.
인벤토리 슬롯을 선택할 때 실행되는 함수('OnSelectSlot')를 AddListener을 이용해서 불러와줍니다.
이럴 경우 프리팹에 있는 버튼 component에 클릭할 때 실행할 함수를 넣어주지 않아도 됩니다.
int n은 for문 밖으로 또는 함수 밖으로 따로 선언을 해주면 제대로 작동하지 않습니다. n 대신 i를 넣어도 제대로 작동하지 않습니다.
if (inventoryItem[index] != null && !inventoryItem[index].equip) { inventoryItem[index].equip = true; GameManager.instance.attack += inventoryItem[index].itemData.attack; GameManager.instance.defense += inventoryItem[index].itemData.defense; GameManager.instance.critical += inventoryItem[index].itemData.critical; GameManager.instance.health += inventoryItem[index].itemData.plus_health; GameManager.instance.inventorySlots[index].transform.Find("Equip").gameObject.SetActive(true); GameManager.instance.change_status = true; }
아이템을 넣어주면 inventoryItem != null이며, 장착되지 않은 상태인 아이템일 경우 장착되고 itemData에 있는 정보를 추가해줍니다.
change_status는 Update 함수에서 계속 실행되지 말라고 설정해줬습니다.
가장 힘들었던 부분이였습니다.
unity와 script 중 우선 순위는 unity인데..
생성한 구조 자체가 script -> unity로 정보 이동이 필요했기 때문에 더 힘들었던 것 같습니다.
그래도 새로 만들게 되어서 좀 빠르게 해결된 것 같았습니다.