https://github.com/Cysharp/UniTask
GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity.
Provides an efficient allocation free async/await integration for Unity. - Cysharp/UniTask
github.com
UniTask는 Async, Await를 활용한 라이브러리 중 하나이다. 비동기 작업 메서드, Task가 존재함에도 불구하고 유니테스크를 사용하는 이유는 유니테스크가 싱글 스레드를 사용하는 유니티 환경에서의 Task가 가지는 단점을 보완하여 강력한 비동기 작업을 구현할 수 있도록 제작한 라이브러리이기 때문이다.
UniTask의 작동방식
UniTask를 알기 위해서는 멀티 스레드와 싱글 스레드의 차이점을 알 필요가 있다.
싱글 스레드는 하나의 스레드의 모든 작업을 처리하는 것이다, 멀티 스레드는 여러개의 스레드를 만들고 Main스레드에서 일을 할당하는 식으로 작동하는 방식을 말한다.
여기서 UniTask는 멀티 스레드의 개념을 활용한다.
사실 UniTask라고 보기 보다는 await와 async의 개념이다.
await는 다음과 같이 한 스레드의 작업을 할당하고 스레드 풀에 채워 넣어 순서대로 작동하게 하는 방식을 가진다. 이때 멀티 스레드를 활용한다.
유니테스크의 장점
1. UniTask<T>와 같은 형태로 함수를 선언하여, 값을 Return할 수 있다.
2. 구조체를 기반으로 제작되었기 때문에, 메모리 할당이 최소화되어, 최적화에 유리하다.
3. 코루틴과 유사한 기능을 제공한다.
4. 메모리 누수를 방지하기 위한 track 시스템을 제공한다.
5. UniTask는 다양한 확장기능을 제공하여, 비동기 작업을 더 유연하게 처리할 수 있다. 예를 들어, UniRx와 통합하여 기능 6. 추가가 가능하다.
7. 유니테스크는 오류처리와 예외처리를 간편하게 수행할 수 있도록 지원한다. Task와 유사한 방식으로 예외 처리가 가능8. 하며, 콜백을 통해 오류 처리도 가능하다.
9. 유니티 엔진 뿐만 아니라 닷넷프레임워크에서도 지원이 가능하다.
UniTask 사용방법
사실 UniTask를 사용하는 이유중 하나는 코루틴의 단점을 상쇠하기 위해서이다. 코루틴의 단점으로는 꼭 MonoBehavior를 상속 받아야 하고 StartCoroutine을 할때마다. IEnumerator가 생성 되어 GC를 유발한다는 점이다. 하지만 Task는 GC를 유발하지 않는다. 미리 만들어 둔 스레드를 할당해주고 MonoBehavior (Pooling) 여튼 그래서 수정한 코드를 보여주겠다.
protected async UniTask Delay(Action action, int delayTime)
{
await UniTask.Delay(TimeSpan.FromSeconds(delayTime),
false,PlayerLoopTiming.Update,
destroyCancellation.Token);
action?.Invoke();
}
Delay를 주고 Action를 실행시켜주는 함수이다. 원래는 MonoBehavior 상속을 못받아서 Manager를 통해서 DelayCallBack이라는 코루틴을 불렀는데 지금은 UniTask를 사용하여 깔끔하게 바꿔주었다.
당연히 Async 키워드를 사용해야 한다. Await 처리를 하기 위해서는 Async 키워드를 사용해야 한다.
UniTask는 다양한 기능들이 있다. GitHub에 들어가면 기능들이 있으니 GitHub를 참고하도록 하고 당장은 Delay라는 함수만 소개하겠다. Delay에 TimeSpan.FromSeconds를 사용하여 시간을 넣어주고 나머지는 크게 중요하지 않은데. destroyCancellation은 중요하다. 이건 Task를 할당하고 해제를 안해서 메모리 릭이 나는 경우를 막기 위해서 미리 Callcellation될 함수에 매개변수로 넣어주는 것이다.
'Unity' 카테고리의 다른 글
[Unity]두개의 EditorWindw 창을 Split, Dock하기 (0) | 2025.04.11 |
---|---|
[졸업작품, Unity] 아이작 방 생성 알고리즘 구현 (0) | 2025.04.03 |
[Unity] 2D 환경에서 점프 구현 (y축 이동이 구현되어 있을 때) (0) | 2025.03.17 |
[졸업작품, Unity] ItemSystem 구조 수정 (0) | 2025.03.14 |
[졸업작품, Unity]Assembly definition를 사용하는 방법 (0) | 2025.03.12 |