유니티 인벤토리 시스템 구현하기 #6[아이템 슬롯 클래스]
Intro
이번 포스팅에서는 아이템 슬롯 클래스를 작성합니다.
아이템 슬롯 클래스는 다음과 같은 데이터들을 관리합니다.
- 슬롯 인덱스
- 슬롯 접근 가능 여부
- 아이템 이미지
- 아이템 수량 텍스트
- 커서를 갖다 댔을때의 하이라이트 이미지
또한 슬롯에서 발생할 모든 기능들을 구현합니다.
- 아이템 이미지의 변경/보이기/숨기기
- 아이템 수량 텍스트의 변경/보이기/숨기기
- 하이라이트 이미지의 보이기/숨기기
- 슬롯 접근 가능 여부의 변경
등의 기능들을 구현해주어야합니다.
ItemSlotUI 클래스
- 먼저, ItemSlotUI 클래스의 필드입니다.
public class ItemSlotUI : MonoBehaviour
{
[Header("# Options")]
[SerializeField] private float padding = 1f; // .. 슬롯 내 아이콘과 슬롯 사이 여백
[SerializeField] private float highlightAlpha = 0.5f; // .. 하이라이트 이미지 알파값
[SerializeField] private float highlightFadeDuration = 0.2f; // .. 하이라이트 소요 시간
[Header("# Connected Objects")]
[SerializeField] private Image iconImage; // .. 아이템 아이콘
[SerializeField] private Text amountText; // .. 아이템 갯수 텍스트
[SerializeField] private Image highlightImage; // .. 포커스 됐을 때 하이라이트 이미지
// Properties
#region
public int Index { get; private set; } // .. 슬롯 인덱스
public bool HasItem => iconImage.sprite != null; // .. 슬롯에 아이템이 있는지 여부(아이콘 여부로 확인)
public bool IsAccessible => isAccessibleSlot && isAccessibleItem; // .. 접근 가능한 슬롯 여부
public RectTransform SlotRect => slotRect; // .. 슬롯의 RectTransform
public RectTransform IconRect => iconRect; // .. 아이콘의 RectTransform
#endregion
// Private Fields
#region
private InventoryUI inventoryUI;
private RectTransform slotRect; // .. 슬롯 RT
private RectTransform iconRect; // .. 아이콘 RT
private RectTransform highlightRect; // .. 하이라이트이미지 RT
private GameObject iconGo; // .. 아이콘 게임오브젝트
private GameObject textGo; // .. 텍스트 게임오브젝트
private GameObject highlightGo; // .. 하이라이트 게임오브젝트
private Image slotImage;
private bool isAccessibleSlot = true; // .. 슬롯 접근 가능 여부
private bool isAccessibleItem = true; // .. 아이템 접근 가능 여부
private float currentHighlightAlpha = 0f; // .. 현재 하이라이트 이미지 알파값
// .. 비활성화된 슬롯 색상
private readonly Color InaccessibleSlotColor = new Color(0.2f, 0.2f, 0.2f, 0.5f);
// .. 비활성화된 아이콘 색상
private readonly Color InaccessibleIconColor = new Color(0.5f, 0.5f, 0.5f, 0.5f);
#endregion
}
- 다음은 메소드입니다.
void ShowIcon() => iconGo.SetActive(true); // .. 아이콘 활성화
void HideIcon() => iconGo.SetActive(false); // .. 아이콘 비활성화
void ShowText() => textGo.SetActive(true); // .. 텍스트 활성화
void HideText() => textGo.SetActive(false); // .. 텍스트 비활성화
// .. 슬롯 인덱스 설정
public void SetSlotIndex(int index) => Index = index;
// .. 슬롯 활성화/비활성화 여부 설정
public void SetSlotAccessibleState(bool value)
{
if (isAccessibleSlot == value) return; // .. 중복처리
// .. 사용 가능 슬롯 색상
if(value)
{
slotImage.color = Color.black;
}
// .. 사용 불가 슬롯 색상, 아이콘 및 텍스트 숨기기
else
{
slotImage.color = InaccessibleSlotColor;
HideIcon();
HideText();
}
isAccessibleSlot = value;
}
// .. 아이템 활성화/비활성화 여부 설정
public void SetItemAccessibleState(bool value)
{
if (isAccessibleItem == value) return;
if(value)
{
iconImage.color = Color.white;
amountText.color = Color.white;
}
else
{
iconImage.color = InaccessibleIconColor;
amountText.color = InaccessibleIconColor;
}
isAccessibleItem = value;
}
// .. 다른 슬롯과 아이템 아이콘 교환
public void SwapOrMoveIcon(ItemSlotUI other)
{
// .. 제약 조건
if (other == null) return;
if (other == this) return; // .. 자기 자신
if (!this.IsAccessible || !other.IsAccessible) return; // .. 자신 또는 다른 슬롯이 접근불가일 때
var temp = iconImage.sprite;
// .. 1. 다른슬롯에 아이템이 있는 경우 : Swap
if (other.HasItem) SetItem(other.iconImage.sprite);
// .. 2. 없을 때 : Move
else RemoveItem();
other.SetItem(temp);
}
// .. 슬롯에 아이콘 등록
public void SetItem(Sprite itemSprite)
{
// .. 슬롯에 아이템이 없을 때
if(itemSprite != null)
{
iconImage.sprite = itemSprite;
ShowIcon();
}
// .. 있을 때
else
{
RemoveItem();
}
}
// .. 슬롯에서 아이템 제거
public void RemoveItem()
{
// .. 아이콘 지우기, Text 숨기기
iconImage.sprite = null;
HideIcon();
HideText();
}
// .. 아이템 이미지 투명도 설정
public void SetIconAlpha(float alpha)
{
iconImage.color = new Color(iconImage.color.r, iconImage.color.g, iconImage.color.b, alpha);
}
// .. 아이템 갯수 텍스트 설정
public void SetItemAmount(int amount)
{
if (HasItem && amount > 1)
ShowText();
else
HideText();
amountText.text = amount.ToString();
}
- 작성된 ItemSlotUI 클래스를 아이템 슬롯 프리팹의 컴포넌트로 추가해줍니다.
- 그리고 아이템슬롯의 아이콘, 텍스트, 하이라이트이미지를 연결해줍니다.
댓글남기기