chyam

[unity 3d] - 오브젝트들을 인벤토리에 저장하기 본문

unity

[unity 3d] - 오브젝트들을 인벤토리에 저장하기

chyam_eun 2025. 3. 7. 19:39

<구현 목표>

오브젝트들을 인벤토리에 저장해보기!

 

저번에는 한개의 오브젝트만 저장해서 변수를 지정하지 않았기 때문에 이를 수정해주었습니다.추후에 인벤토리 추가기능을 만들때 약간 더 수정할 예정입니다!

 

 

먼저, Raycast를 통해 충돌한 물체의 tag와 이름을 저장해줍니다.

"G"키를 누르면 먼저 tag를 확인해줍니다. 

    void ColliderObject()
    {
        Vector3 startPosition = transform.position + Vector3.up * 10f;
        RaycastHit hit;

        if (Physics.Raycast(startPosition, transform.forward, out hit, 12))
        {
            string hitString = hit.collider.gameObject.tag;
            string hitName = hit.collider.gameObject.name;
            
            if (Input.GetKeyDown(KeyCode.G)) // 물체 얻기
            {
                TagCheck(hitName, hit, hitString);
            } 
            ...
        }
    }

 

 

tag가 "flower"이나 "log"이면 Inventory 스크립트에 있는 Check(name)을 실행시킨 뒤 파괴해줍니다.

    void TagCheck(string name, RaycastHit hit, string hitString)
    {
        if (hitString == "flower" || hitString == "log")
        {
            Inventory.Instance.Check(name);
            Destroy(hit.collider.gameObject);
        }
    }

 

 

Check(name)은 오브젝트의 이름과 아이템의 이름을 비교하여 올바른 곳에 넣어줍니다.

    public void Check(string name)
    {
        FreshSlot();
        int i = 0;
        for (; i < slots.Length; i++)
        {
            if (slots[i].item != null)
            {
                if (name.Substring(0, 3) == "log" && "log" == slots[i].item.itemName.Substring(0, 3))
                {
                    print(name);
                    slotText[0].text = (int.Parse(slotText[0].text) + 1).ToString();
                }
                else if (name.Substring(0, 3) == "flo" && name == slots[i].item.itemName) //슬롯과 이름이 같을때만 
                {
                    int slotnum = int.Parse(name.Substring(name.Length - 1, 1));
                    slotText[slotnum].text = (int.Parse(slotText[slotnum].text) + 1).ToString();
                    break;
                }
            }
        }
        
        for(i = 0; i < slots.Length; i++) { 

            if (slotText[i].text != "0") //0이 아니면 숫자가 보임
            {
                slotText[i].gameObject.SetActive(true);
            }
            else
            {
                slotText[i].gameObject.SetActive(false);
            }

            if (int.Parse(slotText[i].text) == 5 && slots[i].item.itemName == "log")
            {
                if (!bridge.activeSelf) // 다리가 공개되지 않았을때
                {
                    print("나무를 5개 모았습니다!");
                    bridge.SetActive(true);
                    slotText[i].text = "0";
                }
            }
        }
    }

 

 

처음에 꽃을 한번 먹으면 3개씩 저장되는 오류가 있었는데, 이는 슬롯의 이름을 비교할때 "flo"로만 비교하여 flower로 시작하는 슬롯이 3개라 발생한 오류였습니다..

 

name은 오브젝트의 이름으로, log로 시작하는건 하나밖에 없어서 간단하게 구현해주었습니다.

log의 이름들은 다 log_a1 , a2...이런식으로 되어있어서 0번째부터 3자리까지 "log"이고, 아이템의 이름도 "log"일 때, slotText의 텍스트를 1 증가시켜주었습니다.

 

flower은 색깔이 3가지라서 flower1, flower2 ... 이런식으로 되어있어서 name이 아이템이름과 같고 name이 flo로 시작할때, 마지막에 있는 숫자를 인덱스로 하여 slotText의 값을 증가시켜주었습니다.

        int i = 0;
        for (; i < slots.Length; i++)
        {
            if (slots[i].item != null)
            {
                if (name.Substring(0, 3) == "log" && "log" == slots[i].item.itemName)
                {
                    slotText[0].text = (int.Parse(slotText[0].text) + 1).ToString();
                }
                else if (name.Substring(0, 3) == "flo" && name == slots[i].item.itemName) //슬롯과 이름이 같을때만 
                {
                    int slotnum = int.Parse(name.Substring(name.Length - 1, 1));
                    slotText[slotnum].text = (int.Parse(slotText[slotnum].text) + 1).ToString();
                    break;
                }
            }
        }

 

0이 아닐때 숫자가 보이게 해주었고, 아이템 이름이 log일때 5이상이고 다리의 active 상태가 false일때만 다리를 보여주게하고 개수를 0으로 초기화 해주었습니다.

for(i = 0; i < slots.Length; i++) { 

	if (slotText[i].text != "0") //0이 아니면 숫자가 보임
	{
		slotText[i].gameObject.SetActive(true);
	}
	else
	{
		slotText[i].gameObject.SetActive(false);
	}

    if (int.Parse(slotText[i].text) == 5 && slots[i].item.itemName == "log")
    {
          if (!bridge.activeSelf) // 다리가 공개되지 않았을때
          {
               print("나무를 5개 모았습니다!");
               bridge.SetActive(true);
               slotText[i].text = "0";
           }
     }
}