Unity/RPG Project
RPG Project - 29 [ Description System ]
SiJun-Park
2024. 11. 13. 23:10
이번에 만든 것은 설명 입니다.
일반적인 RPG에서 많이 보이는 아이템, 스킬 같은 Slot에 마우스를 오버시키면 설명이 나오는 시스템을 만들려고 합니다.
위와 같이 프리팹을 설정 해주었고
그리고 중요한 기능 중 하나인 텍스트 길이에 따라 이미지도 길어져야 하기 때문에 설정을 해주었습니다.
위와 같이 설정을 하면 이제 텍스트 길이에 맞추어서 이미지도 늘어납니다.
여기서 맨 밑에 있는 Canvas Group은 마우스 오버를 인식하지 않기 위해서 설정을 해주었습니다.
public void MouseOver(object script, GameObject window)
{
_window = window;
_Rwindow = _window.transform as RectTransform;
UpdateDescriptionPosition(); // 위치 업데이트
if (_init) return;
if(script is SlotControl slot) InformationUpdate(slot.GetItem()._name, slot.GetItem()._description);
}
script를 불러와서 이제 해당 스크립트에 맞게 업데이트를 해줍니다.
public void OnPointerEnter(PointerEventData eventData) { if (this._isUsing == false) return; _mouseovercheck = true; _descrption_window.gameObject.SetActive(true); }
public void OnPointerExit(PointerEventData eventData) { _mouseovercheck = false; _descriptControl._init = false; _descrption_window.gameObject.SetActive(false); }
//여기서 init을 넣은 이유는 지속적으로 정보를 업데이트를 할 필요가 없으니. 정보는 업데이트는 한번만 해주기 위해서
private void Update()
{
if (_mouseovercheck) _descriptControl.MouseOver(this, _descrption_window);
}
위의 함수는 이제 slot에서 마우스가 올라오고 사용중이면 실행이 되도록 하였습니다.
또한 밑에 Exit를 보면 Init을 false를 하는데 이는 정보를 한번만 업데이트 하기 위해서입니다
즉 Slot 1번째 칸이 "가죽갑옷" 이라고 하였다면 또 마우스로 올렸을 때 한번 더 불러오는 것 보다는
이미 저장된 값을 불러오는 것이 좋을 것 같아 이렇게 하였습니다.
-> 원래는 Dictionary로 관리를 해서 불러오게 하려고 했으나.. 일단 간단하게 구현해보자 해서 위와같은 방법을 택하였습니다
void InformationUpdate(string Toptext, string BodyText)
{
_toptext.text = Toptext;
_bodytext.text = BodyText;
}
void UpdateDescriptionPosition()
{
RectTransformUtility.ScreenPointToLocalPointInRectangle(
_Rwindow.parent as RectTransform,
Input.mousePosition,
null,
out mousePos);
calPos = mousePos - _Rwindow.sizeDelta / 2;
_Rwindow.anchoredPosition = calPos;
}
이제는 정보를 업데이트를 해준 뒤 마우스 포지션을 잡아줍니다.
이때 너무 가운데 오면 안보이니 모서리 쪽으로 가기 위해서 /2를 해줍니다