버튼을 누를 때 눌리고 있는 효과를 내 주기 위한 방법
1. Event Trigger 컴포넌트 활용하기
버튼 오브젝트에 Event Trigger 컴포넌트를 추가해주고, Add New Event Type으로
Pointer Down(눌렸을 때)
Pointer Up(뗐을 때)
이벤트를 추가해서 스크립트 넣고 각각 이벤트 발생 시 실행할 함수를 지정해주면 된다
2. 스크립트로 추가하기
* 기존에 사용하던 이벤트 핸들러를 수정하여 사용했다
public class UI_PressEventHandler : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public Action<PointerEventData> OnDownHandler = null;
public Action<PointerEventData> OnUpHandler = null;
public void OnPointerDown(PointerEventData eventData)
{
if (OnDownHandler != null)
OnDownHandler.Invoke(eventData);
}
public void OnPointerUp(PointerEventData eventData)
{
if (OnUpHandler != null)
OnUpHandler.Invoke(eventData);
}
}
UI_PressEventHandler를 생성해 주고
1. 대상 게임 오브젝트에 UI_PressEventHandler 추가하기
2. OnDownHandler와 OnUpHandler에 각각 action 추가하기
를 해 주면 된다
public static void BindEvent(
GameObject go,
Action<PointerEventData> action,
Define.UIEvent type = Define.UIEvent.Click,
Action<PointerEventData> actionEx = null
)
{
switch (type)
{
case Define.UIEvent.Press:
UI_PressEventHandler pressEvt = Util.GetOrAddComponent<UI_PressEventHandler>(go);
pressEvt.OnDownHandler -= action;
pressEvt.OnUpHandler -= actionEx;
pressEvt.OnDownHandler += action;
pressEvt.OnUpHandler += actionEx;
break;
}
}
나의 경우 UI_Base 스크립트에 위와 같이 작성해주는 방식으로 구현하였다
이어서 버튼 컴포넌트에서
private void BtnDownEvt(PointerEventData data)
{
Dir dir = (Dir)Enum.Parse(typeof(Dir), data.pointerEnter.name);
Debug.Log(dir);
PressBtn(dir, true);
dirCoroutine[(int)dir] = StartCoroutine(MovePlayer(dir));
}
private void BtnUpEvt(PointerEventData data)
{
Dir dir = (Dir)Enum.Parse(typeof(Dir), data.pointerPress.name);
PressBtn(dir, false);
if (dirCoroutine[(int)dir] != null)
StopCoroutine(dirCoroutine[(int)dir]);
player.SetStop();
}
이런 식으로 작성해주면 된다
(BtnDownEvt, BtnUpEvt는 각각 OnDownHandler, OnUpHandler에 연결시켜두었다)
* 각 버튼 오브젝트의 이름도 아래 Dir 내 이름들과 동일하게 맞춰두어야 한다
enum Dir
{
Up,
Down,
Left,
Right
}
Dir의 경우 Define 스크립트 내에 위와 같이 작성해두었다
* data에서 오브젝트의 이름을 받아올 때
클릭 이벤트의 경우 data.pointerClick.name으로 받아올 수 있었지만 지금은 Enter와 Exit 상태에 이벤트를 연결해둔 것이기 때문에 각각 pointerEnter과 pointerPress로 data에서 이름을 추출해야 한다
'Programing > Unity(C#)' 카테고리의 다른 글
[Unity] 오브젝트 위치를 Tilemap/GridLayout 칸에 맞추기 (0) | 2024.03.05 |
---|---|
[Unity] 게임 오브젝트 이동 방법(transform, rigidbody) (0) | 2024.03.05 |
[C#] using static (정적 멤버 직접 사용) (0) | 2024.03.04 |
[Unity] 물리 충돌 시 떨림 현상 (0) | 2024.03.04 |
[Unity] 도트 리소스 불러올 때 픽셀이 깨지는 문제 (0) | 2024.03.03 |