✔ 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 데이터 처리
감사합니다.
'Programming > Unity' 카테고리의 다른 글
[Unity] 빌드 후 해상도 고정하기 - 풀스크린, 창모드 (514) | 2022.03.08 |
---|---|
[Unity] Polybrush - NullReferenceException [Solustion] (594) | 2022.03.02 |
[Unity3D] 스크립트에서 UI 크기 변경 - RectTransform(stretch 포함) (4) | 2022.01.06 |
[Unity3D] 마우스 더블 클릭 이벤트 ( UI, 3D Object ) (2) | 2021.11.24 |
[Unity3D] Unity에서 MSSQL 연동 및 사용하기 , 빌드 후 Encoding 949 문제 해결 (2) | 2021.11.07 |
댓글