인프런 커뮤니티 질문&답변

황주은님의 프로필 이미지
황주은

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

UI Manager #1

이벤트로 연결할 함수들은 무조건 PointerEventData를 추가해주어야하나요?

해결된 질문

작성

·

170

·

수정됨

0

지금 구조 상 UI_EventHandler에서 클릭이벤트를 처리하는 함수가 매개변수로 PointerEventData타입을 받게 되어있는데

질문 1. 그렇다면 UI_Popup에 정의한 ClosePopupUI()함수도 닫기버튼을 눌렀을때 닫으려면 아래와 같이 수정해서 사용하면 되는걸까요?

using System.Collections;
using System.Collections.Generic;
using Managers;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.PlayerLoop;

namespace UI.Popup
{
    public class UI_Popup : UI_Base
    {
        protected enum Buttons
        {
            CloseButton
        }

        public override void Init()
        {
            Manager.UI.SetCanvas(gameObject, true);
        }

        public virtual void ClosePopupUI(PointerEventData pointerEventData)
        {
            Manager.UI.ClosePopupUI(this);
        }
    }
}

질문 2. 매개변수로 PointerEventData가 아닌 다른 것도 함께 매개변수로 넘기고 싶은 경우에는 이렇게 그에 맞는 ActoinHandler를 일일이 추가하는 방법말고 다른 방법은 없을까요?

public class UI_EventHandler : MonoBehaviour, IPointerClickHandler, IDragHandler, IBeginDragHandler, IEndDragHandler
{
    public Action<PointerEventData> OnClickHandler = null;
    public Action<PointerEventData> OnRightMouseBtnClickHandler = null;
    public Action<PointerEventData> OnBeginDragHandler = null;
    public Action<PointerEventData> OnDragHandler = null;
    public Action<PointerEventData,UI_InvenItemSlot> OnInvenHandler = null;
    public Action<PointerEventData> OnEndDragHandler = null;


    public void OnDrag(PointerEventData eventData) //오브젝트를 드래그 중일때 매프레임 호출
    {
        OnDragHandler?.Invoke(eventData);
    }

    public void OnDrag(PointerEventData data, UI_InvenItemSlot slot)
    {
        OnInvenHandler?.Invoke(data, slot);
    }

답변 2

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

Action<PointerEventData> 형태가 아니라 예를 들면 Action<MyUIEventData> 같은거로 만들고,
MyUIEventData를 상속받은 클래스를 인자로 넘기는 방법을 얘기한 것입니다.

황주은님의 프로필 이미지
황주은
질문자

설명 감사합니다 강사님 :) 많은 도움이 됐습니다!!

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

  1. 네 그렇습니다. 종종 다른 강의에서는 람다를 이용하기도 합니다.
    ex) (evt) => { ClosePopup(); }

  2. 네 그렇게 개별 노가다를 하거나, object를 사용해서 캐스팅을 하거나, 공용 클래스를 파서 상속을 이용하거나,
    다양한 문법을 이용해서 구현해주시면 됩니다.

황주은님의 프로필 이미지
황주은
질문자

답변 감사합니다 강사님!

마지막에 말씀해주신 공용 클래스로 상속을 한다는게 어떤 방식인지 잘 이해가 안되어서 그러는데 괜찮으시다면 한번만 설명해주실 수 있을까요?

 

그리고 한가지 더 궁금한게 close버튼처럼 파생클래스들이 모두 사용할 버튼들은 부모클래스(UI_Popup)로 빼서 enum형 말고 protected Button closeButton = Get~ 이런식으로 Button type 변수를 만들어서 쓰는 수 밖에 없나요?

지금 방식에서 하듯이 enum형으로 UI_popup에 close버튼을 만들어도 별개로 취급되는거같고 bind할 때도 enum타입 이름이 겹쳐서 같은 키값이 2개가 되어 오류가 날 수 밖에 없는데

제 머리로는 이 방식이나 아니면 Interface로 closeInterface를 만들어서 UI_Popup에 상속시키는 거? 정도 생각이 드는데 결국 인터페이스에서도 Button타입의 변수로 선언해야하는 건 같은거 같아서 여쭤봅니다.

황주은님의 프로필 이미지
황주은

작성한 질문수

질문하기