최종프로젝트 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, InventorySlotController의 OnDrop()부분에 코드를 추가했다.
public void OnDrop(PointerEventData eventData)
{
// … 기존 드롭/스왑 처리 …
// 드롭 직후, 마우스가 여전히 이 슬롯 위면 툴팁 갱신
if (RectTransformUtility.RectangleContainsScreenPoint(
GetComponent<RectTransform>(),
eventData.position,
eventData.enterEventCamera))
{
var publisher = GetComponent<SlotTooltipEventPublisher>();
publisher.OnPointerEnter(eventData);
}
}
그나저나 난 인벤토리랑 스킬 작업이 어떻게 합쳐지려나 되게 걱정됐는데 팀장님이 능력자셔서 그런지 알아서 합쳐오셨다. 굉장한데?! 나중에 머지되면 코드좀 읽어볼까 한다.
내일은 포션 추가하고 한 삼일 이상 작업 못하고 있는 경고창을... 시간이 나면 하려고한다. 어떻게보면 우선순위가 너무 아니어서 자꾸 밀리고는 있는데 하면 좋으니까~
아니 그리고 왜 요즘 자꾸 한 오후 8시쯤에 이상한거 하나씩 찾는지 모르겠다. 오늘은 필터링이 이상하게 걸리는걸 확인해서 내일은 오전에 또 이거 고쳐야 한다. 아...