최종 프로젝트 3주차 - 상점 로직 (판매)
오늘이 제일 의욕이 안나는 날이었다. 왤까... 늘어지는 날이다... 우리팀 노션 페이지에 매일 일정을 적었었는데 오늘은 적지도 않았다...
<오늘 작업> 2025/7/8
SaleEventPublisher
public void OnPointerClick(PointerEventData eventData)
{
if (eventData.button != PointerEventData.InputButton.Right)
return;
if (!StoreManager.Instance.IsSaleTabActive)
return;
var item = GetComponent<DraggableItem>();
var origin = GetComponentInParent<InventorySlotController>();
if (item == null || origin == null) return;
//이벤트 발행
EventBus.Publish(new SaleRequestedEvent
{
item = item,
originSlot = origin
});
}
IPointerClickHandler 로 우클릭만 걸러내고StoreManager 의 IsSaleTabActive 플래그로 판매 탭 여부 체크SaleRequestedEvent 에 아이템과 원래 슬롯 정보를 담아 이벤트 버스에 발행SaleManager
private void OnSaleRequested(SaleRequestedEvent e)
{
//판매 슬롯 생성
var go = Instantiate(saleSlotPrefab, saleList);
var slot = go.GetComponent<SaleSlotController>();
slot.Initialize(e.item.itemData, e.item, e.originSlot);
// 실제 아이템을 OriginSlot에서 뽑아서 이 슬롯으로 옮기기
e.item.transform.SetParent(go.transform, false);
e.item.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
e.item.SetDragEnabled(false);
//이미지 안보이게
var img = e.item.GetComponent<Image>();
if (img != null) img.enabled = false;
activeSales.Add(slot);
UpdateTotalPrice();
}
SaleSlotController 프리팹을 동적 생성(activeSales)에 추가하고 총 판매 금액을 갱신하나씩 판매를 취소 할 수 있는 기능이다.
SaleManager
private void OnSaleCanceled(SaleCanceledEvent e)
{
//빈 인벤토리 슬롯 찾아서 돌려놓기
e.saleSlot.ReturnToOrigin();
//판매 UI에서 제거
activeSales.Remove(e.saleSlot);
Destroy(e.saleSlot.gameObject);
UpdateTotalPrice();
}
구매탭을 누르거나 상점창을 닫았을 때 판매대에 올린 아이템이 모두 취소되어 인벤토리로 돌아가게 하는 기능이다.
SaleManager
public void CancelAllSales()
{
foreach (var slot in new List<SaleSlotController>(activeSales))
EventBus.Publish(new SaleCanceledEvent { saleSlot = slot });
}
판매 확인 버튼을 누르면 판매대에 올린 아이템이 전부 Destroy가 된다. 그리고 골드도 추가 해야하는데 이건 아직 미구현.
SaleManager
public void ConfirmSale()
{
// 골드 지급 로직 추가 예정
// 모든 판매 슬롯의 아이템 파괴
foreach (var slot in new List<SaleSlotController>(activeSales))
{
slot.DestroyItem();
Destroy(slot.gameObject);
}
activeSales.Clear();
UpdateTotalPrice();
}
일단 판매로직은 내가 생각했던대로 구현이 되긴 했다. 싱글톤이냐 이벤트버스냐 고민을 좀 하느라고 시간이 걸렸지만?
그리고 오늘은 타이틀 화면을 만드는 날이었는데 아 뭔가 저번 프로젝트처럼 멋있는 타이틀을 만들고 싶었는데 그림은 못 그리겠고 딱히 떠오르는 아이디어도 없고 팀장님도 그냥 버튼 연결만 ㄱㄱ 이런 느낌이라 그냥 그렇게 해버렸다... 멋있지 않으면 만족스럽지 않아!! 다음에 다시 도전이다!
음 내일은 판매 로직 조금만 손 보고 (드래그 기능 추가) 저장 기능을 구현해볼까한다. 한번도 해 본적 없는데 내가 잘 할 수 있을까..? 두렵다로아콘