Unity

Unity - async 함수에 관하여

sungmin08 2025. 8. 4. 15:30

🧠 먼저 알아야 할 핵심 개념 3가지

용어 쉽게 말하면 예시
async "기다릴 수 있는 함수야!" 라고 표시하는 것 async Task MyFunc() { ... }
await "이 작업이 끝날 때까지 기다려줘!" await DownloadImage()
Task "나중에 결과가 나올 거야!" 라는 약속 Task<string>은 "나중에 string 줄게"
 

✅ 1. bool 함수

  • 그냥 즉시 true/false를 반환하는 함수
  • 기다릴 필요 없음 (동기 함수)

🧩 예시:

bool IsEven(int number)
{
    return number % 2 == 0;
}
  • 2를 넣으면 바로 true, 3을 넣으면 false
  • await 못 씀

✅ 2. async Task 함수

  • "결과가 없는 비동기 작업" 할 때 사용해
  • 예: 이미지 다운로드, DB 저장

🧩 예시:

async Task DownloadImage()
{
    UnityWebRequest www = UnityWebRequestTexture.GetTexture("http://image.png");
    await www.SendWebRequest(); // 여기서 기다림
    Debug.Log("다운 완료!");
}
  • void처럼 결과가 없지만, 기다림이 필요해서 await로 호출할 수 있음
await DownloadImage();

✅ 3. async Task<bool> 함수

  • "true 또는 false를 나중에 줄게!"
  • 예: 로그인 성공/실패, 이미지 유효성 확인 등

🧩 예시:

async Task<bool> CheckLogin(string email, string pw)
{
    await Task.Delay(1000); // 로그인 처리 기다리는 중
    return (email == "abc@test.com" && pw == "1234");
}
  • 호출할 땐 이렇게 기다리고 받아야 해:
bool result = await CheckLogin("abc@test.com", "1234");
if (result)
    Debug.Log("로그인 성공");
else
    Debug.Log("실패");

✅ 4. ContinueWith vs await

항목 ContinueWith await
문법 작업이 끝나면 그다음 실행 기다렸다가 아래 코드 실행
가독성 중첩돼서 복잡할 수 있음 순서대로 읽기 쉬움
사용 위치 Firebase에서 종종 사용됨 Unity에서도 많이 사용됨
 

🧩 ContinueWith 예시:

GetDataFromServer().ContinueWith(task => { Debug.Log("작업 끝! 결과: " + task.Result); });

🧩 await 버전:

var result = await GetDataFromServer(); Debug.Log("작업 끝! 결과: " + result);

💡 언제 어떤 걸 써야 할까?

상황추천 함수 형태이유
상황 추천 함수 형태 이유
단순 판단 (바로 true/false 리턴) bool 기다릴 필요 없음
다운로드, 저장 등 시간이 걸리는 작업 async Task 기다릴 필요 O, 결과 없음
성공/실패를 알고 싶은 비동기 작업 async Task<bool> 기다리고 결과도 있어야 함
오래 걸리는 작업 뒤에 처리 연결 await, 가능하면 ContinueWith 대신 사용 코드가 깔끔하고 이해 쉬움
 

🎯 최종 요약 정리

함수 형태 의미 예시 사용법
bool true/false 즉시 줌 IsEven(3) if (IsEven(3)) { ... }
async Task 결과 없음, 기다림 필요 DownloadImage() await DownloadImage()
async Task<bool> 결과 있음, 기다림 필요 CheckLogin() bool ok = await CheckLogin()

 

🧠 기억 꿀팁

async와 함께 쓰는 리턴은 무조건 Task나 Task<T>만 된다!
그리고 bool을 쓰고 싶으면 Task<bool>로 써야 await할 수 있다!