Chapter 11-5. 포션 제조 : 재료 툴팁

Date:     Updated:

카테고리:

태그:

인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click

포션 제조 : 재료 툴팁

🚀 툴팁 UI 만들기

image

CREATE 버튼 위에 마우스 커서를 올리면 이렇게 해당 포션 아이템을 만들 때 필요한 재료들을 보여주는 툴팁을 띄울 것이다.

image

  • Panel UI ToolTip (앵커 프리셋 middle - center, 바깥쪽 연한 초록색 테두리가 됨)
    • Panel UI ToolTip_Inner (ToolTip 패널보다 작은 진한 초록색)
      • 포션 아이템 이름 텍스트
      • 포션 아이템에 필요한 아이템 목록 보여주는 텍스트 (\n로 줄 구분)
      • 포션 아이템에 필요한 아이템 개수 목록 보여주는 텍스트 (\n로 줄 구분)
  • ToolTip은 비활성화를 디폴트로 한다. CREATE 버튼 위에 마우스 커서를 올릴 때만 활성화


🚀 툴팁 띄우기 및 포션 생성시 인벤토리에서 재료 차감

📜ArchemyToolTip

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

public class ArchemyToolTip : MonoBehaviour
{
    [SerializeField] private Text text_NeedItemName;
    [SerializeField] private Text text_NeedItemNumber;

    [SerializeField] private GameObject go_BaseToolTip;

    private void Clear()
    {
        text_NeedItemName.text = "";
        text_NeedItemNumber.text = "";
    }

    public void ShowTooltip(string[] _needItemName, int[] _needItemNumber)
    {
        Clear();
        go_BaseToolTip.SetActive(true); // 툴팁 UI 활성화

        for (int i = 0; i < _needItemNumber.Length; i++)
        {
            text_NeedItemName.text += _needItemName[i] + "\n";
            text_NeedItemNumber.text += " x " + _needItemNumber[i] + "\n";
        }
    }

    public void HideToolTip()
    {
        Clear();
        go_BaseToolTip.SetActive(false); // 툴팁 UI 비활성화
    }
}

연금 테이블 프리팹의 컴포넌트로 붙인다.


📜ArchemyButton

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

public class ArchemyButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    [SerializeField] private ArchemyTable theArchemy;
    [SerializeField] private int buttonNum;
    
    public void OnPointerEnter(PointerEventData eventData)
    {
        theArchemy.ShowToolTip(buttonNum);
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        theArchemy.HideToolTip();
    }
}

CREATE 버튼들에게 붙인다.

이 스크립트가 붙는 CREATE 버튼들에 마우스 커서가 들어오고 나가는 이벤트가 발생하면 각각 밑에 후술할 📜ArchemyTable의 ShowToolTip, HideToolTip 함수를 호출한다. 이 함수들 또한 📜ArchemyToolTip 의 ShowToolTip, HideToolTip 함수를 호출한다.

image


📜ArchemyTable

[System.Serializable]
public class ArchemyItem
{
    public string itemName;
    public string itemDescription;
    public Sprite itemImage;

    public string[] needItemName;
    public int[] needItemNumber;

    public float itemCraftingTime; // 포션 제조에 걸리는 시간 (5초, 10초, 100초)

    public GameObject go_ItemPrefab; // 실제 생성될 포션
}

public class ArchemyTable : MonoBehaviour
{
    [SerializeField] private ArchemyToolTip theToolTip;
    private Inventory theInventory;

    private AudioSource theAudio;
    [SerializeField] private AudioClip sound_ButtonClick; // CREATE 버튼 클릭시 효과음
    [SerializeField] private AudioClip sound_Beep; // 아이템 부족으로 생성 불가할 때 효과음
    [SerializeField] private AudioClip sound_Activate; // 아이템을 만들기 시작했을 떄 효과음
    [SerializeField] private AudioClip sound_ExitItem; // 아이템이 완성되어 빠져나올 때 효과음

  • 포션 아이템의 속성으로 needItemName, needItemNumber 배열을 추가해주었다.
    • 해당 포션 아이템을 제작할 때 필요한 아이템 이름들, 아이템 개수들
  • 효과음도 사용할 것
    private void PlaySE(AudioClip _clip)
    {
        theAudio.clip = _clip;
        theAudio.Play();
    }

    void Start()
    {
        theInventory = FindObjectOfType<Inventory>();
        theAudio = GetComponent<AudioSource>();

        ClearSlot();
        PageSetting();
    }

    private void DequeueItem()
    {
        PlaySE(sound_Activate);
        isCrafting = true; // 대기열에서 뺏으니 제작 시작
        currentCraftingItem = archemyItemQueue.Dequeue();

        craftingTime = currentCraftingItem.itemCraftingTime;
        currentCraftingTime = 0;
        slider_gauge.maxValue = craftingTime;

        CraftingImageChange();
    }

    public void Buttonclick(int _buttonNum)
    {
        PlaySE(sound_ButtonClick);

        if (archemyItemQueue.Count < 3)
        {
            int archemyItemArrayNumber = _buttonNum + (page - 1) * theNumberOfSlot;

            // 인벤토리에서 재료 검색
            for (int i = 0; i < archemyItems[archemyItemArrayNumber].needItemName.Length; i++)
            {
                if (theInventory.GetItemCount(archemyItems[archemyItemArrayNumber].needItemName[i]) < archemyItems[archemyItemArrayNumber].needItemNumber[i])
                {
                    PlaySE(sound_Beep);
                    return;  // 제작 안됨
                }
            }

            // 인벤토리에서 재료 차감
            for (int i = 0; i < archemyItems[archemyItemArrayNumber].needItemName.Length; i++)
            {
                theInventory.SetItemCount(archemyItems[archemyItemArrayNumber].needItemName[i], archemyItems[archemyItemArrayNumber].needItemNumber[i]);
            }

            // 제작 시작
            archemyItemQueue.Enqueue(archemyItems[archemyItemArrayNumber]);
            
            image_CraftingItems[archemyItemQueue.Count].gameObject.SetActive(true);
            image_CraftingItems[archemyItemQueue.Count].sprite = archemyItems[archemyItemArrayNumber].itemImage;
        }
        else
        {
            PlaySE(sound_Beep);
        }
    }

    public void UpButton()
    {
        PlaySE(sound_ButtonClick);

        if (page != 1)
            page--;
        else
            page = 1 + archemyItems.Length / theNumberOfSlot; // 최대 페이지

        ClearSlot();
        PageSetting();
    }

    public void DownButton()
    {
        PlaySE(sound_ButtonClick);

        if (page < 1 + archemyItems.Length / theNumberOfSlot)
            page++;
        else
            page = 1;

        ClearSlot();
        PageSetting();
    }

    public void ShowToolTip(int _buttonNum)
    {
        int _archemyItemArrayNumber = _buttonNum + ((page - 1) * theNumberOfSlot); // 페이지 고려
        theToolTip.ShowTooltip(archemyItems[_archemyItemArrayNumber].needItemName, archemyItems[_archemyItemArrayNumber].needItemNumber);
    }

    public void HideToolTip()
    {
        theToolTip.HideToolTip();
    }

과정이 9.4 건축 : 건축 아이템 소모 포스트와 매우 비슷하기 때문에 설명 생략.

image

레드 포션 아이템에 필요한 재료는 Twig, Log 로 각각 1 개, 1 개 필요.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 3 카테고리 내 다른 글 보러가기

댓글 남기기