내일배움캠프 65일차

박나연·2025년 7월 8일

내배캠

목록 보기
58/69

최종 프로젝트 3주차 - 상점 로직 (판매)

오늘의 키워드 : 너무너무 늘어지는 날...

오늘이 제일 의욕이 안나는 날이었다. 왤까... 늘어지는 날이다... 우리팀 노션 페이지에 매일 일정을 적었었는데 오늘은 적지도 않았다...

<오늘 작업> 2025/7/8

  • StoreManager.cs 수정
  • SaleSlotController.cs 작성
  • SaleManager.cs 작성 : 이벤트 버스 활용
  • SaleEventPublisher.cs 작성
    • 아이템 프리팹(룬, 포션, 스킬북)에 붙이는 스크립트 / 마우스 오른쪽 클릭
    • 스크럼 때 드래그도 지원했으면 한다는 의견이 있었음

1. 우클릭으로 판매대 올리기

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 로 우클릭만 걸러내고
  • StoreManagerIsSaleTabActive 플래그로 판매 탭 여부 체크
  • SaleRequestedEvent 에 아이템과 원래 슬롯 정보를 담아 이벤트 버스에 발행

2. 판매 슬롯 생성

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)에 추가하고 총 판매 금액을 갱신

3. 개별 판매 취소

하나씩 판매를 취소 할 수 있는 기능이다.

SaleManager


    private void OnSaleCanceled(SaleCanceledEvent e)
    {
        //빈 인벤토리 슬롯 찾아서 돌려놓기
        e.saleSlot.ReturnToOrigin();

        //판매 UI에서 제거
        activeSales.Remove(e.saleSlot);
        Destroy(e.saleSlot.gameObject);

        UpdateTotalPrice();
    }

4. 전체 판매 취소

구매탭을 누르거나 상점창을 닫았을 때 판매대에 올린 아이템이 모두 취소되어 인벤토리로 돌아가게 하는 기능이다.

SaleManager


public void CancelAllSales()
{
    foreach (var slot in new List<SaleSlotController>(activeSales))
        EventBus.Publish(new SaleCanceledEvent { saleSlot = slot });
}

5. 판매 확정

판매 확인 버튼을 누르면 판매대에 올린 아이템이 전부 Destroy가 된다. 그리고 골드도 추가 해야하는데 이건 아직 미구현.

SaleManager


    public void ConfirmSale()
    {
        // 골드 지급 로직 추가 예정

        // 모든 판매 슬롯의 아이템 파괴
        foreach (var slot in new List<SaleSlotController>(activeSales))
        {
            slot.DestroyItem();
            Destroy(slot.gameObject);
        }
        activeSales.Clear();
        UpdateTotalPrice();
    }

마무리하며

일단 판매로직은 내가 생각했던대로 구현이 되긴 했다. 싱글톤이냐 이벤트버스냐 고민을 좀 하느라고 시간이 걸렸지만?
그리고 오늘은 타이틀 화면을 만드는 날이었는데 아 뭔가 저번 프로젝트처럼 멋있는 타이틀을 만들고 싶었는데 그림은 못 그리겠고 딱히 떠오르는 아이디어도 없고 팀장님도 그냥 버튼 연결만 ㄱㄱ 이런 느낌이라 그냥 그렇게 해버렸다... 멋있지 않으면 만족스럽지 않아!! 다음에 다시 도전이다!

내일 할 일

음 내일은 판매 로직 조금만 손 보고 (드래그 기능 추가) 저장 기능을 구현해볼까한다. 한번도 해 본적 없는데 내가 잘 할 수 있을까..? 두렵다로아콘

0개의 댓글