작성
·
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 요소에 추가되어 있고 올바르게 설정되었는지 등을 확인해야 합니다.
위에 언급된 문제와 유사한 상황에 대한 질문을 참고해보시는 것을 권장합니다. 다음은 참고할 수 있는 기존 질문 및 답변의 링크입니다:
코드상의 오타나 소소한 실수들이 눈에 잘 띄지 않을 때가 많아, 다른 수강생이 겪었던 문제와 그 해결 방법을 참조하는 것이 도움됩니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
ㅠㅠ AI형 고마워요 내가 멍청이네요 ㅠㅠㅠ 진짜 멍청함의 극치를 보여줬네요 ㅠㅠ