Unity/UIUX프로그래밍

0420 _ 인벤토리 만들기

minquu 2021. 4. 20. 13:20
반응형

순서대로

 

0. 아이템 프리팹을 empty (인벤토리상 비어있는 곳)의 자식으로 넣는 것을 테스트한다.

 

 

 

 

1. 관리를 해줄 배열 또는 리스트(동적)를 만들어서 아이템을 넣어준다.

 

배열을 만들어준다.

 

 

엠피티 배열은 + 모양의 아이콘이있는 곳이다. 이것의 0번째 인덱스에 카운터의 숫자 (처음 0)를 해주면

0 번째에 빈 엠피티에 값이 parent의 값이 된다.

 

인스턴스 할때 parent.transform 위치에 위치하게 해준다. (외적 관리)

 

그 인스턴스 된 녀석의 UIItem 스크립터를 가져와준다.

 

그리고 리스트에 넣어준다. (내적 관리)

 

 

 

★ 아틀라스에서 스프라이트를 가져온느 방법이다 ()에 문자열로 이름을 넣어주면 된다.

 

 

 

---

 

-UIInventory 스크립터

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;

public class UIInventory : MonoBehaviour
{
    public GameObject[] arrEmpty;
    private List<UIItem> items;

    private GameObject prefab;
    public SpriteAtlas atlas;
    public Transform empty;


    void Start()
    {
        this.prefab = Resources.Load<GameObject>("UIItem");
        this.items = new List<UIItem>();

        this.AddItem(100);
        this.AddItem(200);
        this.AddItem(300);
        this.AddItem(400);
        this.AddItem(500);

    }

    public void AddItem(int id) {
        var parent = this.arrEmpty[this.items.Count];
        var go = Instantiate<GameObject>(this.prefab, parent.transform) ;
        var uiItem = go.GetComponent<UIItem>();
        this.items.Add(uiItem);
        string spName = "";
        if (id == 100)
        {
            spName = "inventory_item_bomb";
        }
        else if (id == 200)
        {
            spName = "inventory_item_clover";
        }
        else if (id == 300)
        {
            spName = "inventory_item_gift";
        }
        else if (id == 400)
        {
            spName = "inventory_item_hammer";
        }
        else if (id == 500)
        {
            spName = "inventory_item_horner";
        }
        Sprite sp = this.atlas.GetSprite(spName);
        uiItem.Init(id, sp, 2);
    }
}

 

 

-UIItem 스크립터

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIItem : MonoBehaviour
{
    public Image icon;
    public Text txtCount;
    public Button btn;
    public int id;
    public void Init(int id, Sprite icon, int amount)
    {
        this.id = id;
        this.icon.sprite = icon;
        this.txtCount.text = amount.ToString();
    }
}

 

 

 

 

2. 추가한 아이템을 지우기

핵심

- 현재 우리한테 보여지는 (arrEmpty) 것과 보여지지 않지만 가지고있는 데이터 (List<UIItem>의 배열 )를 둘 다 지워 줘야한다

 

    private void GetItem(int id) { //지우는 단계
        var uiItem = this.items.Find(x => x.id == id);
        if (uiItem != null) {
            for (int i = 0; i < this.arrEmpty.Length; i++) {
                var go = this.arrEmpty[i];
                if (go.transform.childCount > 0) {
                    var child = go.transform.GetChild(0);
                    if (child != null) {
                        var target = child.GetComponent<UIItem>();
                        if (target.id == id) {
                            Destroy(target.gameObject);
                            this.items.Remove(uiItem);

                            break;
                        }
                    }
                }
            }
        }
    }

 

        var uiItem = this.items.Find(x => x.id == id);

uiItem의 변수의 메서드에서 찾는 id 값을 Find 라는 키워드를 사용해서 찾는다. 

 

 if (uiItem != null) {
            for (int i = 0; i < this.arrEmpty.Length; i++) {
                var go = this.arrEmpty[i];

 

만약 그 변수가 널이 아니면 for를 arrEmpty 길이 만큼 돌려서 go 를 arrEmpty 값으로 넣는다.

 

 

 if (go.transform.childCount > 0) {
                    var child = go.transform.GetChild(0);

 

그리고 go 의 자식이 있다면, transform.childCount // 자식의 숫자

child 변수의   transform.Getchild(idx) // 자식을 가지와서 child 변수에 넣는다.

 

 

if (child != null) {
                        var target = child.GetComponent<UIItem>();
                        if (target.id == id) {
                            Destroy(target.gameObject);
                            this.items.Remove(uiItem);

                            break;
                        }

 

만약 child 가 널이 아니라면

var target 변수에 그 child의 겟 컴포넌트를 해서 UIItem 스크립터를 가져온다.

 

만약 target.id 와 지울려고하는 id가 같으면

 

Destroy(target.gameObject) // 외적삭제 // 타겟의 게임오브젝트(Empty 위에 있는)를 지워준다

 

this.items.Remove(uiItem) // 내적삭제 // 리스트 배열에서 아이템을 삭제해준다.

 

 

-----

 

    void Start()
    {
        this.prefab = Resources.Load<GameObject>("UIItem");
        this.items = new List<UIItem>();

        this.AddItem(100);
        this.AddItem(200);
        this.AddItem(300);
        this.AddItem(400);
        this.AddItem(500);

        this.GetItem(400);
    }

 

400 id를 가진 녀석을 지울것이다.

 

--

 

 

 

반응형