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

lover123e님의 프로필 이미지
lover123e

작성한 질문수

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

UI 자동화 #4

버튼 클릭시 점수가 올라가지 않습니다.

작성

·

58

1

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class UI_Button : UI_Base
{
    //[SerializeField]
    //TextMeshProUGUI _text;

    enum Buttons
    {
        PointButton
    }

    enum Texts
    {
        PointText,
        ScoreText,
    }

    enum GameObjects
    {
        TestObject,
    }

    enum Images
    {
        ItemIcon,
    }    

    private void Start()
    {
        Bind<Button>(typeof(Buttons));
        Bind<TextMeshProUGUI>(typeof(Texts));
        Bind<GameObject>(typeof(GameObjects));
        Bind<Image>(typeof(Images));

        //Get<TextMeshProUGUI>((int)Texts.ScoreText).text = "Bind Test";

        GetButton((int)Buttons.PointButton).gameObject.AddUIEvent(OnButtonClicked);
        
        GameObject go = GetImage((int)Images.ItemIcon).gameObject;
        AddUIEvent(go, (PointerEventData data) => { go.transform.position = data.position; },Define.UIEvnet.Drag);
    }

    int _score = 0;

    public void OnButtonClicked(PointerEventData data)
    {
        _score++;
        //_text.text = $"점수 : {_score}";
        Get<TextMeshProUGUI>((int)Texts.ScoreText).text = $"점수 : {_score}";
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class UI_Base : MonoBehaviour
{
    Dictionary<Type, UnityEngine.Object[]> _objects = new Dictionary<Type, UnityEngine.Object[]>();

    protected void Bind<T>(Type type) where T : UnityEngine.Object
    {
        string[] names = Enum.GetNames(type);
        UnityEngine.Object[] objects = new UnityEngine.Object[names.Length];
        _objects.Add(typeof(T), objects);

        for (int i = 0; i < names.Length; i++)
        {
            if (typeof(T) == typeof(GameObject))
                objects[i] = Util.FindChild(gameObject, names[i], true);
            else
                objects[i] = Util.FindChild<T>(gameObject, names[i], true);

            if (objects[i] == null)
                Debug.Log($"Failed to bind({names[i]})");
        }
    }

    protected T Get<T>(int idx) where T : UnityEngine.Object
    {
        UnityEngine.Object[] objects = null;
        if (_objects.TryGetValue(typeof(T), out objects) == false)
            return null;

        return objects[idx] as T;
    }

    protected TextMeshProUGUI GetText(int idx)
    {
        return Get<TextMeshProUGUI>(idx);
    }

    protected Button GetButton(int idx)
    {
        return Get<Button>(idx);
    }

    protected Image GetImage(int idx)
    {
        return Get<Image>(idx);
    }

    public static void AddUIEvent(GameObject go, Action<PointerEventData>action,Define.UIEvnet type = Define.UIEvnet.Click)
    {
        UI_EventHandler evt = Util.GetOrAddComponent<UI_EventHandler>(go);
        switch(type)
        {
            case Define.UIEvnet.Click:
                evt.OnClickHandler -= action;
                evt.OnClickHandler += action;
                break;

            case Define.UIEvnet.Drag:
                evt.OnDragHandler -= action;
                evt.OnDragHandler += action;
                break;
        }
               
        //evt.OnDragHandler += ((PointerEventData data) => { evt.gameObject.transform.position = data.position;  });
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UIElements;

public class UI_EventHandler : MonoBehaviour, IPointerClickHander ,IDragHandler
{
    public Action<PointerEventData> OnClickHandler = null;
    public Action<PointerEventData> OnDragHandler = null;

    public void OnPointerClick(PointerEventData eventData)
    {
        if (OnClickHandler != null)
            OnClickHandler.Invoke(eventData);
    }

    public void OnDrag(PointerEventData eventData)
    {
        if (OnDragHandler != null)
            OnDragHandler.Invoke(eventData);
    }
}

드래그작동은 잘 되는데, 버튼 클릭하면 점수가 올라가지 않습니다.

UI_Button스크립트에 52번째줄, public void OnButtonClicked 부분에 중단점을 찍어 보기도 했고,

UI_Base 스크립트의 switch문에 있는 Click과 Drag부분에도 해봤는데 어느부분이 문제가 있는지 찾지를 못했습니다.

제가 디버깅을 잘 못해서 이런건지..ㅠㅠ

 

다른 분들 질문과, 코드 정리 올려주신거 비교해봐도 틀린 부분이 없는거 같은데 무슨 문제인지 잘 모르겠습니다 ㅠㅠ

 

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

lover123e님의 질문에 대한 답변입니다. 코드를 검토해본 결과, 제시된 코드와 유사한 상황에서 발생한 문제와 그 해결 방안을 찾았습니다. 해당 상황은 버튼 클릭 이벤트가 동작하지 않는 경우였고, 다른 수강생도 비슷한 문제를 겪었습니다.

문제의 원인 중 하나는 UI_EventHandler 스크립트의 IPointerClickHander 인터페이스가 올바르게 구현되지 않았을 가능성이 있습니다. 코드에서 IPointerClickHander는 오타로 보입니다. 실제로는 IPointerClickHandler가 정확한 인터페이스 명입니다. 이 오타로 인해 클릭 이벤트가 올바르게 등록되지 않았을 수 있습니다.

이와 더불어, 코드에 다른 문제가 없는지 확인하는 것이 중요합니다. 예를 들어, AddUIEvent 함수에서 이벤트를 등록할 때, 올바른 객체에 이벤트가 추가되었는지, UI_EventHandler 컴포넌트가 해당 UI 요소에 추가되어 있고 올바르게 설정되었는지 등을 확인해야 합니다.

위에 언급된 문제와 유사한 상황에 대한 질문을 참고해보시는 것을 권장합니다. 다음은 참고할 수 있는 기존 질문 및 답변의 링크입니다:

코드상의 오타나 소소한 실수들이 눈에 잘 띄지 않을 때가 많아, 다른 수강생이 겪었던 문제와 그 해결 방법을 참조하는 것이 도움됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

lover123e님의 프로필 이미지
lover123e
질문자

ㅠㅠ AI형 고마워요 내가 멍청이네요 ㅠㅠㅠ 진짜 멍청함의 극치를 보여줬네요 ㅠㅠ

lover123e님의 프로필 이미지
lover123e

작성한 질문수

질문하기