Chapter 11-5. 포션 제조 : 재료 툴팁
카테고리: Unity Lesson 3
태그: Unity Game Engine
인프런에 있는 케이디님의 [유니티 3D] 실전! 생존게임 만들기 - Advanced 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click
포션 제조 : 재료 툴팁
🚀 툴팁 UI 만들기
CREATE 버튼 위에 마우스 커서를 올리면 이렇게 해당 포션 아이템을 만들 때 필요한 재료들을 보여주는 툴팁을 띄울 것이다.
- Panel UI
ToolTip
(앵커 프리셋 middle - center, 바깥쪽 연한 초록색 테두리가 됨)- Panel UI
ToolTip_Inner
(ToolTip
패널보다 작은 진한 초록색)- 포션 아이템 이름 텍스트
- 포션 아이템에 필요한 아이템 목록 보여주는 텍스트 (
\n
로 줄 구분) - 포션 아이템에 필요한 아이템 개수 목록 보여주는 텍스트 (
\n
로 줄 구분)
- Panel UI
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 함수를 호출한다.
📜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 건축 : 건축 아이템 소모 포스트와 매우 비슷하기 때문에 설명 생략.
레드 포션 아이템에 필요한 재료는 Twig, Log 로 각각 1 개, 1 개 필요.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기