최종프로젝트 2주차 - 인벤토리 툴팁
<오늘 작업> 6/30
DraggableItem.cs 수정TooltipEventPublisher.cs, ItemTooltip.cs수정오늘부터 15일간 TIL을 매일 작성해야한다는 지령을 받았다. 하긴 난 원래 매일 썼는데 요즘 하루 이틀 정도 안쓰긴 했다만... 어떻게 아시고 기강을 잡으러 오셨다. 우리 팀원들은 쓰기 싫어하는 것 같았지만 이번기회에 열심히 써주길 바라는 마음이다. 벌써 전광판 생기면 안에다가 오늘의 노래추천, 팀 로고, 게임 제목, 오늘의 한강 온도, 점메추, 저메추, 팀원 캐릭터 이미지 넣기, 생일 광고판 등 매일매일 뭐 넣을지 생각중이다.
엥? 김칫국이라고..?

아무튼 오늘은 인벤토리에 이미지가 다 빠져있어서 그것 좀 다시 채워주고 더 꾸미려고 했는데 흠... 왤케 밍숭맹숭하지 뭔가 약간 마음에 안드는건 있긴한데 뭐 디자인은 나중에라도 고칠 수 있으니까 보류하려고 한다. 그리고 우리는 스킬이 평소엔 스킬북 아이템 형태였다가 스킬 슬롯에 넣으면 활성화되는 그런걸 생각하고 있었어서 오늘은 그걸 만들었다. 처음엔 딱히 어렵지 않았다. 어차피 이미지 하나만 더 추가하면 되는거고 요점은 스킬 슬롯에 있을때만 스킬 이미지로, 그 외에는 전부 스킬북 형태면 되기 때문이다. 하다가 약간 문제가 생겼던건, 아이템 드래그를 담당하는 스크립트에서 스킬북이미지로 만드는 메서드, 스킬 이미지로 만드는 메서드 하나씩 만들어서 필요하다고 생각되는 다른 스크립트에 할당해주다보니까 사혼의 조각마냥 다 퍼지고 특정 행동에서는 제대로 동작이 안되는 일이 생겼다.
1. 드래그 중일 때 - 스킬 북
2. 스킬 슬롯에서 잠깐 떼어냈을 때(드래그 중) - 스킬 북
2-1. 떼어냈다가 잘못된 곳에 드랍됐을 때 - 스킬
3. 다른 스킬 슬롯으로 스킬 이동 - 스킬
이런 느낌이라 고려해야할게 좀 있었던 것이다. 그리고! 마참내 알아낸 해결법
그것은 바로 OnTransformParentChanged()이다. 이건 Unity 메시지라서 직접 호출해 주는 게 아니라 부모가 바뀌는 순간 Unity 엔진이 자동으로 불러준다.
//부모가 바뀔 때 자동 실행 (스킬북 <-> 스킬 이미지)
void OnTransformParentChanged()
{
// 스킬북 데이터인지 확인
if (itemData is SkillBookData skillData)
{
// 최상위 SkillSlotController를 찾는다
var inSkillSlot = GetComponentInParent<SkillSlotController>() != null;
if (inSkillSlot)
ToSkillSlot(skillData.skillImage);
else
ToInventorySlot();
}
}
드래그 복귀 로직처럼 부모를 바꾸는 모든 순간에 DraggableItem 스크립트 안에 구현된 OnTransformParentChanged() 가 자동으로 실행된다.
내가 원한건 오직 스킬 슬롯에 있을 때만 스킬 이미지가 되도록 하는 것이었기에 의도와 일치해서 사용하게 되었다.
이 메서드 자체는 MonoBehaviour의 메시지 메서드라서 어떤 스크립트에든 구현할 수 있지만 지금처럼 “드래그 가능한 아이템”만 관리하려면 DraggableItem 에만 넣어 두면된다.
즉, private 으로 선언해 두면 외부에서 못 부르지만, Unity가 내부적으로 콜해 주기 때문에 별도의 호출 코드는 필요 없고 부모가 바뀌면 Unity가 자동으로 OnTransformParentChanged() 를 트리거해 주니, 그 안에 아이콘 전환 로직만 넣어 두면 끝!!

다들 로아 하세요
원래는 아이템에 마우스를 올리면 그 아이템의 SO에 적혀있는 이름과 설명만 나왔었다. 그런데 룬을 장착한 스킬에 마우스를 올리면 룬 정보까지 나왔으면 좋겠어서 수정하게 되었다.
//스킬에 룬 목록이 추가되었을 경우
if (evt.attachedRunes != null && evt.attachedRunes.Count > 0)
{
var sb = new System.Text.StringBuilder();
sb.AppendLine("--------------");
sb.AppendLine("Equipped Runes");
foreach (var rune in evt.attachedRunes)
{
sb.AppendLine($"{rune.displayName}: {rune.description}");
}
runesText.text = sb.ToString();
runesText.gameObject.SetActive(true);
}
else
{
runesText.gameObject.SetActive(false);
}
StringBuilder는 여러 줄의 문자열을 효율적으로 이어 붙일 때 쓰는 클래스이다. 원래 쓰던대로 한 줄씩 설명을 추가할 때마다 stringA += "…" + "\n"; 식으로 string끼리 더해 주면 내부적으로 매번 새로운 문자열 객체를 만들어 내서 성능이 떨어질 수 있다.
사용 방법
var sb = new System.Text.StringBuilder();
→ 먼저 빈 StringBuilder 객체를 하나 만든다.
sb.AppendLine("텍스트");
→ 이렇게 하면 "텍스트\n" 처럼 문자열 뒤에 줄바꿈까지 자동으로 해준다.
마지막으로 sb.ToString() 을 호출하면
지금까지 AppendLine 으로 쌓아 놓은 모든 줄을 하나의 문자열로 반환해준다.
결과

잘 나온다!
아 참고로 글이 길어짐에 따라 이미지도 같이 늘어나게 하고 싶다면 일단 기준점을 잡기 위해 RectTransform의 Anchors - Min Y, Max Y 와 Pivot - Y값을 조정해주자. 난 1로 해줬다. 이렇게 하면 아래로 길어진다. 만약 위로 길어지게 하고싶다면 0으로 맞춰주자. Content Size Fitter도 추가해서 Preferred Size로 설정 바꿔주는것도 잊지말기!
오늘은 수정된 스크립트는 많이 없었지만 그래도 새로운 것 두 개를 알게 되어서 좋았다. 까먹지 않고 나중에 또 잘 써먹어야 할텐데?! 그리고 오늘 담당 튜터님이 오셔서 코드 쓱 보고 가셨는데 뭔가 두근두근 긴장됐다. 막 집중 질문하고 왜 이렇게 했냐 별로다 혼날까봐 지례 겁먹은거긴한데 아직 막 보여줄 단계는 아니라서 큰 피드백은 없었다. 아마 나중에 자세히 보실 것 같은데 정리좀 미리미리 잘해둬야겠다고 생각하게 되었다...
내일은 모든 팝업창을 만드는게 내 목표다! 기능부터 만들고 디자인하기!<-난 자꾸 디자인먼저 손보려고 해서 이거 생각해놔야 하는 부분이다;;
+ 툴팁 테스트 하다가 이상하게 작동하는 부분을 하나 확인해서 이것도 고쳐야 한다 흑흑