본문 바로가기
Programming/Unity

[Unity3D] 유니티에서 Timer 구현하기 - IEnumerator, System.Timers

by 타임박스 2022. 1. 11.
반응형


✔ Unity Timer 

1. IEnumerator로 구현

2. System.Timers.Timer로 구현 



 

안녕하세요.

이번 포스트에서는 Timer(?) 특정시간에 맞춰 실행할 수 있는 방법을 설명드립니다.

방법은 여러가지가 있고 그 방법들에 대해서 설명드리겠습니다.

먼저 첫번째로 IEnumerator를 사용하는 방법입니다.

● IEnumerator

void Start()
{
	//코루틴 실행
    StartCoroutine(Test());
}

//Timer 구현 로직
IEnumerator Test()
{
    while (true)
    {
        //To Do 
        Debug.Log(System.DateTime.Now);
        //0.5초 자원 반환하고 기다림
        yield return new WaitForSeconds(0.5f);
    }
}

//타이머 종료 함수
private StopTimer()
{
    StopCoroutine(Test());
}

StartCoroutine을 통하여 Timer를 실행할 수 있고 StopCoroutine을 통해 종료할 수 있습니다.

일반적으로 Unity에서 가장 많이 사용하는 방식입니다. 하지만 장단점이 다 있습니다.

장점 : 코드 구현이 쉽다. UI 수정이 가능하다.

단점 : 컴퓨터 성능 및 처리 시간에 따라 기다리는 시간이 달라진다.

쉽게 코드를 짠만큼 손해를 볼 수 밖에 없다. 단점을 보완하기 위해서는 //To do 부분에 처리되는 로직의 처리 시간만큼

을 빼고 반환해야한다. 

하지만.. 로직의 처리 시간이 기다리는 시간보다 크거나 초당 프레임이 25이하가 나온다면..? 얼마나 걸릴지 알수없다.

그래서 이 타이머는 정확한 시간에 처리되는 로직보다는 동기화가 필요없이 작동하는 구현로직으로 알맞다. (애니메이션 처리 등)

그럼 정확한 타이머를 구현하고 싶다면 어떻게 해야할까?

결국 C# 네이티브로 사용해야한다.

● System.Timers 활용

using UnityEngine;
using UnityEngine.UI;
using System.Timers;

public class TEST : MonoBehaviour
{
    Timer timer;
    public Text text;
    // Start is called before the first frame update
    void Start()
    {
        timer = new Timer();
        timer.Interval = 500;
        timer.Elapsed += OnTimerEvent;
        //이벤트 반복 발생 여부 > true : 반복 , false : 한번
        timer.AutoReset = true;
        timer.Enabled = true;
        timer.Start();
    }

    void OnTimerEvent(System.Object source, ElapsedEventArgs e)
    {
        //UI 수정 안됨
        //text.text = "test";
        
        //UI 접근은 가능
        //string str = text.text;
        
        Debug.Log(System.DateTime.Now);
    }
  
    private void OnApplicationQuit()
    {
        timer.Stop();
    }
}

 

System.Timers별도의 Thread가 사용되기때문에 다른 로직처리에도 영향도가 없어서 정확한 시간에 로직을 처리할 수 있다.

하지만 이것도 장단점이 존재한다.

장점 : 정확한 시간에 처리가 가능하고 처리속도가 빠르다. 

단점 : UI 수정이 불가능하다.

Unity는 하나의 쓰레드에서 프로그램이 돌아간다. 그렇기 때문에 다른 Thread에서 UI 수정이 불가능하다.

그래서 UI는 다른 방법으로 수정을 해야한다.

방법은 아래 포스트 참조

2019.09.27 - [Programming/Unity] - [Unity] 유니티에서 Thread 사용 - UI 데이터 처리

 

[Unity] 유니티에서 Thread 사용 - UI 데이터 처리

기본적으로 유니티는 멀티쓰레드 기반으로 제작되지 않았습니다. 하지만 유니티는 C# 기반 스크립트로 Thread를 사용할 수 있습니다. 무슨 말이지!?! 쉽게 표현하자면 유니티 API 즉 MonoBehaviour 기반

timeboxstory.tistory.com

 

감사합니다.

반응형

댓글