내일배움캠프 60일차

박나연·2025년 7월 1일

내배캠

목록 보기
53/69

최종프로젝트 2주차 - 툴팁 수정

오늘의 키워드 : 진도가 제자리 걸음 같은 느낌

할건 아직 꽤 남았는데 자꾸 내 의도대로 동작하지 않는 부분이 보여서 거기에 매달리게 된다. 그러다보니 시간이 자꾸 지체되는데 살짝 조급해졌다. 벌써? 싶겠지만 원래는 일주일만에 결과물을 내오지 않았던가? 그래서 그런지 빨리 완성하고싶은 그런 마음이 든다... 속도를 좀 내야할 것 같다!

툴팁 퍼블리셔 분리

오늘 하루종일 툴팁만 만지게 되었던 계기는 스킬 슬롯에서 스킬을 합성했을 때 다른 아이템을 한번 들었다 놓기 전에는 그 어느 아이템도 툴팁이 나오지 않는 문제 때문이었다. 그래서 아이템에 붙어있던 툴팁 퍼블리셔 스크립트를 아이템이 아닌 슬롯 프리팹에 붙이는 방식을 택하게 되었다. 원래 하나였지만 rune, slot이렇게 두개로 나누게 됐는데 그 이유는 현재 스킬 슬롯 프리팹에 룬 슬롯까지 딸려있어서 하나로 하면 룬 슬롯에 마우스를 올려도 스킬설명이 나오는 문제가 있었기 때문이다....

RuneTooltipEventPublisher

.......

    public void OnPointerEnter(PointerEventData eventData)
    {
        //  이 슬롯에 실제 룬 아이콘이 있는지 확인
        var di = GetComponentInChildren<DraggableItem>();
        if (di == null || di.itemData == null) return;
        if (di.itemData.itemType != ItemType.Rune) return;

        //툴팁 위치
        Vector2 showPos = new Vector2(rt.position.x, rt.position.y);

        //  룬 정보만 보여 주면 되므로 attachedRunes 는 빈 리스트
        EventBus.Publish(new TooltipShowEvent
        {
            data = di.itemData,
            screenPosition = showPos,
            attachedRunes = new List<RuneData>()
        });
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        EventBus.Publish(new TooltipHideEvent());
    }
SlotTooltipEventPublisher

.........

    public void OnPointerEnter(PointerEventData eventData)
    {
        var entered = eventData.pointerEnter;
        if (entered == null) return;

        // 룬 슬롯 위라면 스킬 툴팁 무시
        if (entered.GetComponentInParent<RuneSlotController>() != null)
            return;

        // 슬롯 툴팁 퍼블리셔 자신인지 확인
        if (entered.GetComponentInParent<SlotTooltipEventPublisher>() != this)
            return;

        // 슬롯에 실제 아이템이 있는지 검사
        ItemData data = null;
        List<RuneData> runes = new List<RuneData>();

        if (skillSlot != null && skillSlot.skillDragItem != null)
        {
            data = skillSlot.CurrentSkill;
            runes = new List<RuneData>(
                skillSlot.skillDragItem
                         .GetComponent<SkillItemController>()
                         .attachedRunes
            );
        }
        else if (invSlot != null)
        {
            var di = GetComponentInChildren<DraggableItem>();
            if (di != null)
            {
                data = di.itemData;
                //룬이 장착된 스킬이 인벤토리에 들어갔을 때 반영해 보여주기
                var sic = di.GetComponent<SkillItemController>();
                if (sic != null)
                    runes = new List<RuneData>(sic.attachedRunes);
            }
        }
        if (data == null) return;

        // 툴팁 위치 계산
        Vector2 showPos = new Vector2(rt.position.x, rt.position.y);

        // 이벤트 발행
        EventBus.Publish(new TooltipShowEvent
        {
            data = data,
            screenPosition = showPos,
            attachedRunes = runes
        });
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        EventBus.Publish(new TooltipHideEvent());
    }

이 스크립트는 인벤토리 슬롯이랑 스킬 슬롯 둘 다 붙었어야 했기에 예외처리가 좀 있는 편이다.

드롭 직후 툴팁 즉시 갱신

아이템을 A슬롯 -> B슬롯으로 드롭했을 때 툴팁이 바로 나오지 않는 문제가 있었다. 그래서 RuneslotController, SkillSlotController, InventorySlotControllerOnDrop()부분에 코드를 추가했다.

    public void OnDrop(PointerEventData eventData)
    {
        // … 기존 드롭/스왑 처리 …

        // 드롭 직후, 마우스가 여전히 이 슬롯 위면 툴팁 갱신
        if (RectTransformUtility.RectangleContainsScreenPoint(
                GetComponent<RectTransform>(),
                eventData.position,
                eventData.enterEventCamera))
        {
            var publisher = GetComponent<SlotTooltipEventPublisher>();
            publisher.OnPointerEnter(eventData);
        }
    }

마무리하며

그나저나 난 인벤토리랑 스킬 작업이 어떻게 합쳐지려나 되게 걱정됐는데 팀장님이 능력자셔서 그런지 알아서 합쳐오셨다. 굉장한데?! 나중에 머지되면 코드좀 읽어볼까 한다.

내일 할 일

내일은 포션 추가하고 한 삼일 이상 작업 못하고 있는 경고창을... 시간이 나면 하려고한다. 어떻게보면 우선순위가 너무 아니어서 자꾸 밀리고는 있는데 하면 좋으니까~
아니 그리고 왜 요즘 자꾸 한 오후 8시쯤에 이상한거 하나씩 찾는지 모르겠다. 오늘은 필터링이 이상하게 걸리는걸 확인해서 내일은 오전에 또 이거 고쳐야 한다. 아...

0개의 댓글