UNITY/PROJECT

[๊ตฌํ˜„] ์œ ๋‹ˆํ‹ฐ๋กœ ์‰ฝ๊ฒŒ ์ธ๋ฒคํ† ๋ฆฌ ๊ตฌํ˜„ํ•˜๊ธฐ 2

ozllzL 2021. 12. 8. 17:08

1. ์ธ๋ฒคํ† ๋ฆฌ ์ƒ๋‹จ ์นดํ…Œ๊ณ ๋ฆฌ ์Šค์œ„์น˜

๊ฐ ๋ฒ„ํŠผ์—๋Š” SetIndex๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ์ค€๋‹ค.

๋ˆ„๋ฅธ ๋ฒ„ํŠผ์ด ๋ช‡ ๋ฒˆ์ธ์ง€๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ํ•ด๋‹น ์ˆ˜์— ๋งž๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

public class SelectIndex : MonoBehaviour
{
    public InventoryIndex index = InventoryIndex.Item;
    public GameObject indexes;

    private LoadItems loadItems;
    private GameObject[] indexObj;
    private Color deselect = new Color(0.8f, 0.8f, 0.8f);

    private void Start()
    {
        loadItems = GetComponent<LoadItems>();
        indexObj = new GameObject[3]{ indexes.transform.GetChild(0).gameObject, indexes.transform.GetChild(1).gameObject, indexes.transform.GetChild(2).gameObject };
        MarkIndex();
    }

    public void SetIndex(int selectedIndex)
    {
        int beforeIndex = (int)index;
        switch (selectedIndex)
        {
            case 1:
                index = InventoryIndex.Item;
                break;
            case 2:
                index = InventoryIndex.Hair;
                break;
            case 3:
                index = InventoryIndex.Outfit;
                break;
        }
        MarkIndex();

        loadItems.ResetGoods(beforeIndex);
        loadItems.Refresh();
    }

    public void MarkIndex()
    {
        indexObj[((int)index)].GetComponent<Image>().color = Color.white;
        indexObj[(((int)index) + 1) % 3].GetComponent<Image>().color = deselect;
        indexObj[(((int)index) + 2) % 3].GetComponent<Image>().color = deselect;
        GetComponent<TurnIcon>().CheckIndexItems();
    }
}

loadItems๋Š” ์ธ๋ฒคํ† ๋ฆฌ์˜ ์•„์ดํ…œ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

index๋Š” ํ˜„์žฌ ๋ณด์—ฌ์ง€๊ณ  ์žˆ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ๋ช‡ ๋ฒˆ ์ธ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ณ€์ˆ˜์ด๋‹ค.

๋ชจ๋‘ ์ด ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ํ˜„์žฌ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ํ™•์ธํ•  ๊ฒƒ์ด๋‹ค.

 

๋ˆŒ๋ฆฐ ๋ฒ„ํŠผ์ด ๋ช‡ ๋ฒˆ์ด์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ  index๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

MarkIndex๋Š” ๋ˆŒ๋ฆฐ ๋ฒ„ํŠผ ์™ธ ๋‹ค๋ฅธ ๋ฒ„ํŠผ๋“ค์˜ ์ƒ‰์ƒ์„ ํฐ์ƒ‰์—์„œ ํšŒ์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

2. Item ์ธ๋ฒคํ† ๋ฆฌ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

์šฐ๋ฆฌ๋Š” ์ƒ์ ๋„ ํ•  ๊ณ„ํš์ด๊ธฐ ๋•Œ๋ฌธ์—

์ƒ์ ๊ณผ ์ธ๋ฒคํ† ๋ฆฌ์˜ ๊ณตํ†ต์ ์ธ

์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ ์šฐ๋ฆฌ  ๋ฌผ๊ฑด ์œ„์น˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์™€,

๊ฐœ์ˆ˜๊ฐ€ ํ•œ ๋ฉด์— ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ˆ˜๋ฅผ ๋„˜๊ฒผ์„ ๋•Œ ์ธ๋ฒคํ† ๋ฆฌ์˜ scrollview๋ฅผ ํ™•์žฅํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋งŒ ์ž‘์„ฑํ•˜์—ฌ

LoadItem์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์ƒ์†๋ฐ›์•„

๊ฐ์ž์— ํŠนํ™”๋œ LoadInventory, LoadStore ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค ๊ฒƒ ์ด๋‹ค.

์ฝ์–ด ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๊ฐ€๋Š” ์ฝ”๋“œ์ผ ๊ฒƒ์ด๋‹ค.

์ ์ ˆํ•œ ๊ณณ์— Refreshํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉฐ ์‚ฌ์šฉํ–ˆ๋‹ค.

public class LoadItems : MonoBehaviour
{
    ...

    public virtual void Refresh() { }

    //๋ฌผ๊ฑด ์œ„์น˜ ์ดˆ๊ธฐํ™”
    public void ResetGoods(int indexNumToReset)
    {
        goods = GameObject.FindGameObjectsWithTag(ItemIndex.itemsIndexString[indexNumToReset]);
        for (int i = 0; i < goods.Length; i++)
        {
            goods[i].transform.SetParent(itemInitPosition.transform.GetChild(ItemIndex.itemsIndexInt[indexNumToReset]));
            goods[i].transform.position = new Vector3(-1000, 0, 0);
        }
    }

    //์•„์ดํ…œ ๊ฐœ์ˆ˜์— ๋งž์ถฐ ์ธ๋ฒคํ† ๋ฆฌ ํ™•์žฅ ๋ฉ”์†Œ๋“œ
    public void ExpandInventory()
    {
        if (inventorySlotBox.transform.childCount > goodsMaxWatch)
        {
            {
                int goodsNeedExpand = goods.Length - goodsMaxWatch;
                for (; goodsNeedExpand > 0; goodsNeedExpand -= goodsOneLine)
                {
                    inventorySlotBox.transform.parent.GetComponent<RectTransform>().sizeDelta = new Vector2(inventoryWidth, inventoryHeight += 130);
                }
            }
        }
        else
        {
            inventorySlotBox.transform.parent.GetComponent<RectTransform>().sizeDelta = new Vector2(inventoryWidth, inventoryHeightOri);
            inventoryHeight = 400;
        }
    }
}

๋‹ค์Œ์€ Load Inventory๋‹ค.

public class LoadInventory : LoadItems
{
    private GameObject[] goods;
    private SelectIndex selectIndex;
    private ItemCount itemCount;

    private void Start()
    {
        selectIndex = GetComponent<SelectIndex>();   
    }

    //์ธ๋ฒคํ† ๋ฆฌ ์•„์ดํ…œ ๋กœ๋“œ
    public override void Refresh()
    {
        goods = GameObject.FindGameObjectsWithTag(selectIndex.index.ToString());
        itemCount = GetComponent<ItemSaveLoad>().GetItemCount();

        int selectIndexNum = (int)selectIndex.index;

        if (selectIndexNum == ((int)InventoryIndex.Item))
            RefreshItem();
        else
            RefreshGoods(selectIndexNum);

        ExpandInventory();
    }

    private void RefreshItem()
    {
        for (int i = 0; i < goods.Length; i++)
        {
            int id = goods[i].GetComponent<ItemInfo>().id - 1;
            int count;
            if ((count = itemCount.itemCounts[id]) > 0)
            {
                if (GetComponent<PackingItems>().GetPackedItems().Contains(goods[i]))//์ด ์•„์ดํ…œ์ด ๊ฐ€๋ฐฉ์— ์žˆ๋Š” ์•„์ดํ…œ์ด๋ฉด
                    count--;
                goods[i].transform.GetChild(1).GetChild(0).gameObject.GetComponent<UnityEngine.UI.Text>().text = count.ToString();

                if (count > 0)
                    goods[i].transform.SetParent(inventorySlotBox.transform);
            }

        }
    }

    private void RefreshGoods(int selectIndexNum)
    {
        for (int i = 0; i < goods.Length; i++)
        {
            int id = goods[i].GetComponent<ItemInfo>().id - 1;

            if (itemCount.have[selectIndexNum - 1].haveList[id])
                goods[i].transform.SetParent(inventorySlotBox.transform);

        }
    }
}

Refresh์—์„œ ํ˜„์žฌ ์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ์•„์ดํ…œ์ธ ๊ฒฝ์šฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

์•„์ดํ…œ์ธ ๊ฒฝ์šฐ RefreshItem์„ ์‹คํ–‰์‹œํ‚ค๋Š”๋ฐ,

์šฐ๋ฆฌ ๊ฒŒ์ž„์—์„œ๋Š” ์•„์ดํ…œ์„ ๊ฐ€๋ฐฉ์— ๋„ฃ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์•„์ดํ…œ์ด ๊ฐ€๋ฐฉ์— ๋“ค์–ด์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ€๋ฐฉ์— ๋“ค์–ด์žˆ๋Š” ์•„์ดํ…œ ํฌํ•จํ•˜์—ฌ ๊ฐœ์ˆ˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ€๋ฐฉ์— ๋“ค์–ด์žˆ๋Š” ์•„์ดํ…œ์€ ์ด ์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐœ์ˆ˜๋ฅผ 1 ๋นผ์„œ ์Šคํฌ๋ฆฐ์— ๋ณด์—ฌ์ค€๋‹ค.

๊ทผ๋ฐ ๋ญ ์ด ๊ธฐ๋Šฅ์ด ํ•„์š” ์—†๋Š” ๊ฒŒ์ž„์€ ์•Œ์•„์„œ ๋นผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ผ๋‹จ ํฌ๊ฒŒ๋Š” 0๊ฐœ ์ด์ƒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์•„์ดํ…œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€ slot์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

 

RefreshGoods์—์„œ๋Š” ๊ทธ๋ƒฅ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฒŒ ํ™•์ธ์ด ๋˜๋ฉด slot์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ธ๋ฒคํ† ๋ฆฌ ๋งŒ๋“ค๊ธฐ ๋!

์ธ๋ฒคํ† ๋ฆฌ์˜ ์•„์ดํ…œ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ผ์–ด๋‚˜๋Š” ์ผ์€ ๊ฐ์ž์— ๋งž์ถฐ์„œ ๊ตฌํ˜„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๋‚˜๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋จธ๋ฆฌ, ์˜์ƒ์€ ์ฐฉ์šฉ์ด ๋˜๊ณ  ์•„์ดํ…œ์€ ๊ฐ€๋ฐฉ์— ๋“ค์–ด๊ฐ€๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.