Unity: IPointerEventHandler, 비활성화 된 오브젝트에서 시간 변수 감소시키기

이재형·2024년 5월 30일
0
post-thumbnail
post-custom-banner

Unity 공부

배운 내용

1. IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler

public class Slot : MonoBehaviour, IPointerClickHandler

// 오브젝트를 우클릭 시 Use()메서드 실행
public void OnPointerClick(PointerEventData eventData)
{
    if (data == null) return;

    if (eventData.button == PointerEventData.InputButton.Right)
    {
        Use();
    }
    else if(eventData.button == PointerEventData.InputButton.Middle)
    {
        uiCursor.transform.position = eventData.position;
        uiCursor.UIUpdate(data);
    }
}

설명: 위의 3개는 인터페이스로 마우스와 관련된
1. IPointerClickHandler = 마우스로 오브젝트 클릭했을 때
2. IPointerEnterHandler = 마우스가 컴포넌트된 오브젝트에 첫 접속했을 때
3. IPointerExitHandler = 마우스가 컴포넌트 된 오브젝트에 나왔을 때


2. 비활성화 상태에서 시간 감소

// Player의 코루틴을 매개변수로 받는 메서드를 생성
public void StartCo(IEnumerator coroutine)
{
    StartCoroutine(coroutine);
}

// IEnumerator타입 메서드 생성
IEnumerator TImePlus()
{
    delayIcon.fillAmount = 0;
    while (delayIcon.fillAmount < 1.0f)
    {
        delayTime += Time.deltaTime;

        if (data != null)
        {
            delayIcon.fillAmount = delayTime / data.delayTime;
        }
        yield return null;
    }
}

// 해당 아이템 사용 시
delayTime = 0;
GameManager.Instance.Player.StartCo(TImePlus());

문제 발생: 각 슬롯에 아이템을 사용하는 로직을 만들었는데 진행하다보니 슬롯이 활성화일 때만 시간이 감소하는 문제가 발생하였다.
1. 코루틴을 사용해도 오브젝트가 비활성화가 되어 시간이 감소되지 않음 = X
2. Invoke를 사용해도 코루틴과 같이 시간이 감소되지 않음 = X
3. 싱글톤으로 메서드 정보를 받아서 실행 = O


설명: 싱글톤으로 매니저를 받아서 현재 오브젝트가 실행중인 오브젝트에서 IEnumerator 메서드를 실행 시켜 오브젝트가 비활성화가 되어도 시간이 감소된다.


정리

배운 내용


1. IPointerEventHandler: 버튼 이벤트 대신 사용 가능한 입력 이벤트
2. 비활성화 상태에서 시간 감소: 처음 비활성화 상태에서의 로직이라 난행을 겪었는데 이제 하는 방법을 터득하였기 때문에 활용하는 일만 남았다.

해결 못한 문제

1. 플레이어가 다른 오브젝트에 붙어서 앞으로 이동하면 앞이 아닌 위로 이동하는 문제가 발생

문제점

1. 없음

profile
한국사람
post-custom-banner

0개의 댓글