* 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]
제공함수는 위 공식 문서 참고 !