Unity: 아이템 설치 시 인벤토리에서 삭제

이재형·2024년 6월 5일
0
post-thumbnail
post-custom-banner

Unity 공부

배운 내용

1. 아이템 설치 시 인벤토리에서 삭제

문제 발생: 아이템을 설치했는데 인벤토리에서 아이템 삭제를 구현하지 못함

문제 진행: 아이템 사용할 때 인벤토리의 Index값도 같이 가져와서 설치 완료시 같이 삭제하는 것이 어떤가?

문제 해결: 간단하게 문제없이 Index값을 받아와서 만들어 놓은 Clear메서드를 이용하여 Index의 인벤토리 정보가 삭제되어 구현을 완료하였음

사진: 설치 전

사진: 설치 후

// 데이터를 받을 때 Index값도 같이 받아줌
public void GetData(ItemData data, int index)
{
    // 크래프트 모드일 경우 데이터 받지 못하게 함
    if (this.data != null) return;
    PreviwerObject = Instantiate(data.ViewObject);
    slotIndex = index;
    this.data = data;
}

// 아이템 사용 시 플레이어의 inventory에서 슬롯의 index를 검색하여 Clear실행
if (Physics.Raycast(camera.transform.position, camera.transform.forward, out hitInfo, 10, layerMask))
{
    if (hitInfo.transform != null)
    {
        PreviwerObject.transform.position = hitInfo.point;
        if (creaftMode && PreviwerObject.GetComponent<MeshRenderer>().material.color == Color.green)
        {
            Instantiate(data.dropPrefab, hitInfo.point, Quaternion.identity);
            data = null;
            Destroy(PreviwerObject);
            // 인벤토리의 아이템 삭제
            GameManager.Instance.Player.inventory.GetSlot(slotIndex).Clear();
            slotIndex = -1;
        }
    }
}

설명:
1. GetData()를 사용할 때 아이템 정보와 인덱스 값을 받아줌
2. 아이템 설치할 때 index를 플레이어의 인벤토리에서 슬롯의 index를 찾음
3. index의 슬롯의 메서드 Clear()를 사용하여 아이템 정보를 지움


문제 해결 내용

1. 마우스로 선택해야하는 UI가 1개라도 생성 시 다른 UI를 닫아도 커서가 보이게 하기

// UICursor에 bool타입 inventory와 craft에 여부를 아는 변수 선언
public class UICursor : MonoBehaviour
{
    public TextMeshProUGUI itemName;
    public TextMeshProUGUI itemType;
    public TextMeshProUGUI itemDec;

    public bool invenCursor = false;
    public bool craftCursor = false;
    
// 인벤UI
if (inventoryObject.activeInHierarchy)
{
    GameManager.Instance.Player.cursor.invenCursor = true;
    GameManager.Instance.Player.cursor.CursorCheck();
    inventoryObject.SetActive(false);
    GameManager.Instance.Player.cursor.gameObject.SetActive(false);
}
else
{
    GameManager.Instance.Player.cursor.invenCursor = false;
    GameManager.Instance.Player.cursor.CursorCheck();
    inventoryObject.SetActive(true);
}

// 제작UI
if (ProduceObject.activeInHierarchy)
{
    GameManager.Instance.Player.cursor.craftCursor = true;
    GameManager.Instance.Player.cursor.CursorCheck();
    ProduceObject.SetActive(false);
}
else
{
    GameManager.Instance.Player.cursor.craftCursor = false;
    GameManager.Instance.Player.cursor.CursorCheck();
    ProduceObject.SetActive(true);
}

public void CursorCheck()
{
    if (invenCursor && craftCursor)
    {
        Cursor.lockState = CursorLockMode.Locked;
    }
    else
    {
        Cursor.lockState = CursorLockMode.None;
    }
}

설명: 커서UI 스크립트에 UI활성화 여부를 선택하는 변수 선언
1. 인벤토리와 크래프트의 UI활성화시 같은 변수를 true 또는 false처리
2. 활성화나 비활성화마다 CursorCheck()를 실행하여 Cursor모드를 설정함


정리

배운 내용

1. 머지를 지속적으로 해줘야한다.

해결 못한 문제

1. 없음

문제점

1. 없음

profile
한국사람
post-custom-banner

0개의 댓글