이 프로젝트는 기본적인 아이템 인벤토리와 마인크래프트 스타일 제작 시스템을 구현을 다루고 있습니다. 유저는 아이템을 제작대에 아이템을 조합하여 새로운 아이템을 만들 수 있습니다. 이 시스템은 쉬운 확장성을 고려하여 설계되었기 때문에, 개발자가 새로운 레시피를 손쉽게 추가할 수 있습니다.
제작 재료 칸의 아이템이 레시피와 일치하는지 확인하고, 일치할 경우 제작 아이템을 생성합니다.
프로젝트 주요 특징
1. 재정의 가능한 아이템 칸(ItemSlot) 상호작용
재사용 가능한 이벤트 및 조건 로직.
ItemSlot 상속을 통한 손쉬운 확장성.
작동 원리
ItemSlot 클래스는 아이템 칸 상호작용을 위한 유연하고 모듈화된 기반을 제공합니다.
public class ItemSlot : MonoBehaviour, IPointerClickHandler{ public virtual void OnPointerClick(PointerEventData eventData) { if (eventData.button == PointerEventData.InputButton.Left) { if (ItemOnSlotAndCursor()) { if (!SlotAndCursorSameItem()) SwapItem(); else StackAllItemCursorToSlot(); } else if (ItemOnSlotAndNoCursor()) { PickItem(); } else if (ItemOnNoSlotAndCursor()) { PlaceItem(); } } else if (eventData.button == PointerEventData.InputButton.Right) { if (ItemOnSlotAndCursor()) { if (!SlotAndCursorSameItem()) SwapItem(); else StackOneItemCursorToSlot(); } else if (ItemOnSlotAndNoCursor()) { PickHalfOfItem(); } else if (ItemOnNoSlotAndCursor()) { DropOneItemCursorToSlot(); } } }}
virtual void OnPointerClick() 함수는 아이템 칸이 클릭에 어떻게 반응할지를 결정합니다.
이 함수 내부에서는 미리 만들어둔 이벤트와 조건 함수들을 블록처럼 조합하여 원하는 동작을 만들 수 있습니다.
이 방식 덕분에 핵심 로직을 다시 작성하지 않고도 복잡한 상호작용을 손쉽게 정의 할 수 있습니다.
CraftingOutputSlot 같은 자식 클래스는 아래에 정의된 가상 함수를 간단히 오버라이드하여 원하는 동작을 재정의 할 수 있습니다.
public class CraftingOutputSlot : ItemSlot{ public override void OnPointerClick(PointerEventData eventData) { if (SlotAndCursor()) { if (SlotAndCursorSameItem()) { StackAllItemSlotToCursor(); UpdateInputPanel(); } } else if (SlotAndNoCursor()) { PickItem(); UpdateInputPanel(); } }}
결과: 아이템 칸 유형별로 쉽게 확장, 디버그, 맞춤 설정할 수 있는 깔끔하고 재사용 가능한 동작 구조를 얻을 수 있습니다.
2. 쉬운 레시피(Recipe) 설정
ScriptableObject를 통한 새로운 레시피 추가.
직관적인 시각화 설정을 위한 RecipeEditor.
작동 원리
Recipe는 ScriptableObject로, RecipeEditor의 드래그-앤-드롭 인터페이스를 통해 손쉽게 편집할 수 있습니다.
결과: 위의 RecipeEditor 사용 전후 예시에서 보듯이, Recipe를 손쉽게 설정할 수 있어, 제작 레시피의 생성과 관리를 빠르고 실수 없이 할 수 있고, 개발자와 디자이너 모두가 간편하고 쉽게 활용할 수 있습니다.