ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024.2.7
    TIL 2024. 2. 7. 21:08

    오예~!

    원하는 부분을 어떻게 해결했습니다 ... ㅠ

    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로 정보 이동이 필요했기 때문에 더 힘들었던 것 같습니다.

     

    그래도 새로 만들게 되어서 좀 빠르게 해결된 것 같았습니다. 

     

    'TIL' 카테고리의 다른 글

    2024.2.13  (1) 2024.02.13
    2024.2.8  (0) 2024.02.08
    2024.2.6  (0) 2024.02.06
    2024.2.2  (0) 2024.02.02
    2024.2.1  (1) 2024.02.01
Designed by Tistory.