카테고리 없음

[Unity] Unity 지연동작 구현 - Update, Coroutine, Async/Awiat, UniTask 차이 정리

ibelieveinme 2022. 12. 18. 11:06
728x90

* Update, Coroutine, Async Await, UniTask 차이

 

1) Update: 매 프레임마다 호출되는 Update()문을 이용하여 종료시점을 직접 확인해서 동작 수행. 리턴값이 없어서 종료확인 구문을 추가구현 해야 한다.

 

2) Coroutine: WaitForSecond, WaitForFixedUpdate, WaitForEndOfFrame, WaitUntil 등의 함수형 결과가 있어서 Update()문보다 편리하게 지연구현이 가능하다. ex) yield return new WaitForSeconds(3f); // 3초 후에 결과 반환.

* C#의 yield 키워드: 호출자에게 데이터를 하나씩 리턴할 때 사용.

 

3) Async/Awiat: 비동기 프로그래밍 구현법. async 메소드에서 Task를 수행하고 awiat로 Task가 끝났을 때 호출자에게 return 함. Task 종료시점을 return할 수도 있고 반환값을 Task<int> 등으로 하면 특정 결과값도 리턴할 수 있음.

 

void Start(){
    AsyncFunction();
    Debug.Log("Start End");
}

async void AsyncFunction(){
    awiat Task.Delay(5000);
    Debug.Log("AsyncFunction End");
}

[위 구문의 결과]

Start End

AsyncFunction End

 

using System;
using System.Threading.Tasks;

namespace AsyncTest{
    class Program{
    	public static async Task Main(string[] args){
            Task t = TaskTest();
            
            for(int i = 0; i < 3; i++){
            	System.Console.WriteLine("Do Something Before TaskTest");
            }
            
            awiat t;
            
            for(int i = 0; i < 3; i++){
            	System.Console.WriteLine("Do Something After TaskTest");
            }
        }
        
        private static async Task TaskTest(){
            awiat Task.Delay(5000);
            System.Console.WriteLine("TaskTest Done");
        }
    }

}

Async 함수를 기다렸다가 다음 구문을 수행하고 싶을 때는 위처럼 구현하면 된다.

Task를 생성하고 awiat t; 로 Task를 기다렸다가 그 다음 구문을 수행한다.

 

[위 구문의 결과]

Do Something Before TaskTest

Do Something Before TaskTest

Do Something Before TaskTest

TaskTest Done

Do Something After TaskTest

Do Something After TaskTest

Do Something After TaskTest

 

public static async Task Main(string[] args){
    Task<int> t = TaskTest();
    for(int i = 0; i<3; i++){
    	System.Console.WriteLine("Do Something Before Task");
    }
    int UID = awiat t;
    Console.WriteLine($"UserID: {UID}");
}

private static async Task<int> TastTest(){
    int UID = awiat Server에서 User ID를 얻어오는 비동기 메소드
    System.Console.WriteLine("TaskTest Done");
    return UID;
}

awiat로 특정값을 반환해주고 싶을 때는 위와 같이 작성하면 된다. 객체 전달도 가능하다.

 

4) UniTask: Unity용 async/awiat 통합 패키지. C#이 Task, async/awiat를 Unity에 맞게 최적화하고 기능을 추가한 것. 기존 Task 보다 가볍다고...

 

[Git Open Source & Document]

 

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

제공함수는 위 공식 문서 참고 !

 

728x90