[Project] RPG_TEST(Activate The Equip BTN)



내가 선택한 아이템 강조하기

(1) Canvas 오브젝트의 자식으로 Image(Rect)를 만들고 Image Source를 Tool_Bag으로 바꿔준 다음 색상을 노란색으로 바꾼다.

image

(2) Manager_Inven 스크립트를 수정한다.(방금 만든 Rect 이미지의 공간을 만들기 위해)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class Manager_Inven : MonoBehaviour
{
    [Header("[Frame]")]
    public GameObject charInfoFrame;
    public GameObject bagFrame;
    public GameObject itemInfoFrame;

    [Header("[Bag]")]
    public int gold;
    public TextMeshProUGUI goldAmount;
    /*●*/public Transform rect;


    [Header("[Drag&Drop]")]
    public Transform selectedItem;
    public Transform curParent;
    public Transform parentOnDrag;

    public void OpenBag()
    {
        goldAmount.text=gold.ToString();
        bagFrame.SetActive(true);
    }
}

(3) Items_Action 스크립트를 수정한다.(내가 아이템을 클리했을 때 Manager_Inven에 있는 Rect의 Position값을 내가 클릭한 곳으로 옮기기 위해)

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

public class Items_Action : MonoBehaviour,IPointerUpHandler,IPointerDownHandler,IDragHandler
{
    public Image img;

    [Header("[Location]")]
    public bool inBag;

    float releaseTime;
    bool dragging;

    public void OnPointerDown(PointerEventData eventData)
    {
        img=GetComponent<Image>();
        Manager.instance.manager_Inven.selectedItem = transform;

        if (inBag)
        {
            StartCoroutine("ReleaseTime");
        }
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        if (inBag)
        {
            StopCoroutine("ReleaseTime");
            transform.localScale = new Vector3(1, 1, 1);

            if (releaseTime >= 0.1f)
            {
                transform.SetParent(Manager.instance.manager_Inven.curParent);
                transform.localPosition = Vector3.zero;
                img.raycastTarget = true;
                return;
            }

            if (releaseTime < 0.1f)
            {
                Manager.instance.manager_SE.seAudio.PlayOneShot(Manager.instance.manager_SE.btnB);

                Manager.instance.manager_Inven.itemInfoFrame.SetActive(false);

                Manager.instance.manager_Inven.itemInfoFrame.GetComponent<ItemInfoFrame>().item = GetComponent<Items_Info>();

                Manager.instance.manager_Inven.itemInfoFrame.SetActive(true);

                /*●*/Manager.instance.manager_Inven.rect.position=transform.position;
                /*●*/Manager.instance.manager_Inven.rect.gameObject.SetActive(true);
            }
        }
    }

    public void OnDrag(PointerEventData eventData)
    {
        if (inBag && dragging)
        {
            transform.position = eventData.position;
        }
    }

    IEnumerator ReleaseTime()
    {
        releaseTime = 0;
        dragging = false;

        while (true)
        {
            releaseTime += Time.deltaTime;

            if (releaseTime >= 0.1f)
            {
                transform.localScale = new Vector3(1.3f,1.3f,1);
                if (!dragging)
                {
                    Manager.instance.manager_Inven.itemInfoFrame.SetActive(false);

                    Manager.instance.manager_SE.seAudio.PlayOneShot(Manager.instance.manager_SE.drag);

                    dragging = true;
                    Manager.instance.manager_Inven.curParent = transform.parent;
                    transform.SetParent(Manager.instance.manager_Inven.parentOnDrag);

                    img.raycastTarget = false;

                    /*●*/Manager.instance.manager_Inven.rect.gameObject.SetActive(false);
                }
            }
            yield return null;
        }
    }
}

(4) Rect 오브젝트의 Image 컴포넌트에서 Raycast target을 꺼준다.

(5) Rect 오브젝트도 다른 Frame처럼 Off 할 수 있데 CharInfoFrame에 있는 Event Trigger컴포넌트에 추가해서 SetActive(false) 해준다.

장착 버튼 활성화 하기

(1) ItemInfoFrame오브젝트의 자식으로 빈 오브젝트(ButtonBox)를 만든다.

(2) Button Box의 자식으로 Button(EquipBtn)을 만든다.

  • Width(200) / Height(70) / Source Image(Tool_Slot)

(3) EquipBtn의 Text를 Equip로 바꾼다.

(4) 장착중인 아이템은 해제하기 버튼을 만들어준다. EquipBtn을 복사(ReleaseBtn)한다. Text를 Release로 바꿔준다.

(5) 2개의 버튼을 비활성화 한다.

(6) Items_Info 스크립트를 수정한다.(현재 아이템이 장착중인지 여부를 bool 자료형으로 판단)

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

public class Items_Info : MonoBehaviour
{
    [Header("[Commom Info]")]
    public string type;
    public string name_Item;
    public string info_Item;
    public int resalePrice;
    public int count;

    [Header("[Equipment Info]")]
    public int hpBonus;
    public int atkBonus;
    public int defBonus;
    public float criBonus;

    /*●*/public bool equipped;
}

(7) ItemInfoFrame 스크립트를 수정한다.(Item의 장착여부에 따라 활성화 시키는 버튼을 달리 함)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro; 

public class ItemInfoFrame : MonoBehaviour
{
    public Items_Info item;

    public GameObject statBonus;
    public TextMeshProUGUI name_Item;
    public TextMeshProUGUI info_Item;
    public TextMeshProUGUI resalePrice;
    public TextMeshProUGUI hpBonus;
    public TextMeshProUGUI atkBonus;
    public TextMeshProUGUI defBonus;
    public TextMeshProUGUI criBonus;

    /*●*/[Header("[Button]")]
    /*●*/public GameObject equipBtn;
    /*●*/public GameObject releaseBtn;

    private void OnEnable()
    {
        statBonus.SetActive(false);
        name_Item.text = item.name_Item;
        info_Item.text = item.info_Item;
        resalePrice.text = string.Format("Used Price : {0}",item.resalePrice);

        if(item.type == "Equipment")
        {
            hpBonus.text = string.Format("HP +{0}",item.hpBonus);
            atkBonus.text = string.Format("Atk +{0}", item.atkBonus);
            defBonus.text = string.Format("Def +{0}", item.defBonus);
            criBonus.text = string.Format("Cri +{0}", item.criBonus);
            statBonus.SetActive(true);

            /*●*/if (item.equipped == true)
            /*●*/{
            /*●*/    releaseBtn.SetActive(true);
            /*●*/}
            /*●*/else if(item.equipped == false)
            /*●*/{
            /*●*/    equipBtn.SetActive(true);
            /*●*/}
        }
    }
    /*●*/private void OnDisable()
    /*●*/{
    /*●*/    releaseBtn.SetActive(false);
    /*●*/    equipBtn.SetActive(false);
    /*●*/}
}

이제 게임을 실행해보면 장착이 가능한 아이템 중 작창하고 있으면 해제하기 버튼, 장찯하지 않고 있으면 장착 버튼이 활성화 되는 모습을 볼 수 있다.




© 2022. by KSC

Powered by sora