타이머를 간단하게 만들어봤습니다.
타이머 시작 부분
public void StartTimer(int nRemain, Text txtTimer = null, UnityAction EndCallBack = null)
{
ClearTimer();
_CorTimer = StartCoroutine(CorStartTime(nRemain, txtTimer, EndCallBack));
}
nRemain : 파라미터로 타이머를 동작시킬 시간
txtTimer : 남은 시간을 표기할 Text UI
EndCallBack : 타이머가 완료 후 실행시킬 함수.
코 루틴으로 작동되기 때문에 Clear 하는 부분을 꼭 넣어주도록 합니다.
private void ClearTimer()
{
if (_CorTimer != null)
{
StopCoroutine(_CorTimer);
_CorTimer = null;
}
_bPause = false;
}
타이머 동작 부분
private IEnumerator CorStartTime(int nRemain = 5, Text txtTimer = null, UnityAction EndCallBack = null)
{
while (nRemain >= 0)
{
txtTimer.text = nRemain + " 초 남음";
while (_bPause)
{
yield return null;
}
yield return new WaitForSeconds(1f);
nRemain--;
}
EndCallBack?.Invoke();
}
이 타이머스크립트에는 코 루틴으로 작동되며, WaitForSeconds(1f)로 1초마다 남은 시간을 감소하도록 했습니다. 저는 EndCallBack으로 델리게이트로 넘겨받도록 했는데 이유는 다른 곳에서도 쓰일 수 있도록 했습니다.
그리고 매프 레임 텍스트만 바꾸지만 매 프레임 단위로 실행시키는 함수가 필요하면 EndCallBack처럼 받고 매프 레임 실행시켜주면 되겠죠.
일시정지
타이머를 잠깐 멈추는 일시정지를 하는 부분입니다. 버튼 부분에 달아주고 OnPointerDown과 OnPointerUp을 통해 제어하도록 해줬습니다.
public class EventButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
private TimerUI _TimerUI = null;
public void SetData(TimerUI TimerUI)
{
_TimerUI = TimerUI;
}
//클릭 누름.
public void OnPointerDown(PointerEventData eventData)
{
Debug.LogError("퍼즈");
_TimerUI.ins_Timer.SetPause(true);
}
//클릭 뗌.
public void OnPointerUp(PointerEventData eventData)
{
Debug.LogError("퍼즈 취소");
_TimerUI.ins_Timer.SetPause(false);
}
}
ins_Timer는 타이머 동작부분이 구현되어있는 스크립트입니다. SetPause를 통해 코루틴을 잠시 멈추도록합니다.
구현결과
'유니티 > 기능구현' 카테고리의 다른 글
유니티) 좌우로 흐르는 글자(텍스트) (4) | 2021.12.22 |
---|---|
유니티) 가변셀, 가변스크롤 LayoutRebuilder.ForceRebuildLayoutImmediate (0) | 2020.07.23 |
유니티) 포물선 궤적그리기,포탄 궤적 (1) | 2019.03.20 |
유니티) 미니맵 만들기 RenderTexture (0) | 2019.02.25 |
유니티) 오브젝트 레이캐스트 검출하기 (Physics.Raycast) (0) | 2019.02.21 |