본문 바로가기
C++,C#/공부

[C# 공부] Unity UniTask

by 으얏 2023. 1. 9.

UniTask 바로가기

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. - GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity.

github.com

 

UniTask 란?

UniTask는 Unity용 async-await 통합 패키지 입니다.

C#의 Task, async-await를 Unity에 맞게 더 최적화 하고 유니티에서 사용하기 편하도록 만든 기능입니다.

 

Unity 코루틴의 단점 :

서버로 부터 받은 값을 IEnumrator 함수에서 return 할 수가 없습니다.

그리고 StartCoroutine을 사용할 때 마다 GC 할당량이 높은 편 입니다. 특히 yield return new를 사용할 때, new로 인한 할당이 지속적으로 발생합니다. 

 

UniTask의 장점 :

Struct 기반으로 제작되어 있어서 Zero Allocation이 특징입니다.

서버로 부터 받은 값을 return 할 수 있습니다.

자체적으로 UniTask.Yeild, UniTask.Delay, UniTask.DelayFrame 처럼 코루틴과 유사한 기능을 제공합니다.

메모리 누수를 방지하기 위한 TaskTracker 창을 지원합니다.

 

UniTask 설치 :

1. Release 부분에 최신버전을 클릭하여 설치합니다.

2. Table of Contents > UPM Package로 이동하여 Package Manager에서  http:~~ 부분을 복사하여 추가합니다.

 

UniTask 테스트 :

스크립트 요점 :

1. 코루틴과 유니테스크는 비슷하게 작용합니다.

2. 유니테스크에서 Timescale 값을 무시하는 방법은 DelayType.UnscaledDeltaTime을 사용하면 됩니다.

3. DelayType.UnscaledDeltaTime을 사용하게 되면 Timescale 값이 0이 되어도 계속 진행합니다.

4. Void를 쓰게되면 .Forget(); 을 붙여줘야 합니다.

5. 특정 수가 되면 멈추는 함수를 작성하는 방법은 WaitUtil로 코루틴과 유사합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cysharp.Threading.Tasks; // UniTask를 쓰기위해서 필요합니다.
using System; // TimeSpan을 쓰기위해서 필요합니다.

public class UniTaskTest : MonoBehaviour
{
    private IEnumerator CoTest()
    {
        yield return new WaitForSeconds(1f);
        Debug.Log("Co 1초지남");
    }

    private async UniTaskVoid TaskTest()
    {
        //DelayType.UnscaledDeltaTime Timescale 값이 0이 되어도 계속 진행합니다.
        await UniTask.Delay(TimeSpan.FromSeconds(1f), DelayType.UnscaledDeltaTime);
        Debug.Log("Task 1초지남");
    }

    private void Start()
    {
        Time.timeScale = 0;
        StartCoroutine(CoTest());

        // Void를 사용하면 Forget을 붙이라고 문서에 나와있습니다.
        TaskTest().Forget();
    }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cysharp.Threading.Tasks;
using System;

public class UniTaskTest : MonoBehaviour
{
	public int count;

    private IEnumerator CoTest()
    {
        yield return new WaitUntil(() => count == 3);
        Debug.Log("Co 3이 되었다.");        
    }

    private async UniTaskVoid TaskTest()
    {
        await UniTask.WaitUntil(() => count == 3);
        Debug.Log("Task 3이 되었다.");
    }

    private void Start()    
    {    
        TaskTest().Forget();
    }
}

 

 

Dotween과도 호환가능 합니다.

 

더 많은 정보는 여기서 확인하시면 됩니다. (허락해주신 용쌤 감사합니다.)

 

영상출처 : 

https://www.youtube.com/watch?v=j3hpuVB2cLk&t=1423s&ab_channel=NKStudio%EC%9D%98%EC%9C%A0%EB%8B%88%ED%8B%B0%EC%8A%A4%ED%8E%98%EC%85%9C%ED%85%8C%ED%81%AC%EB%8B%89 

더 많은 설명 :

https://docs.google.com/file/d/1Wdu5SnqPYEVDGaHJ0Mefam5Ig9iGQhv-/view

 

UniTask.pptx

 

docs.google.com

 

댓글