Unity/RPG Project

RPG Project - 29 [ Description System ]

SiJun-Park 2024. 11. 13. 23:10

이번에 만든 것은 설명 입니다.

 

일반적인 RPG에서 많이 보이는 아이템, 스킬 같은 Slot에 마우스를 오버시키면 설명이 나오는 시스템을 만들려고 합니다.

 

Prefab

위와 같이 프리팹을 설정 해주었고

 

그리고 중요한 기능 중 하나인 텍스트 길이에 따라 이미지도 길어져야 하기 때문에 설정을 해주었습니다.

 

설정

위와 같이 설정을 하면 이제 텍스트 길이에 맞추어서 이미지도 늘어납니다.

 

여기서 맨 밑에 있는 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를 해줍니다 

 

결과