태그 보관물: coroutine

코루틴 결과값 리턴받기

코루틴을 사용한 리소스 비동기 로딩 구현 도중 특정 코루틴의 결과값을 리턴받아야 할 일이 생겼습니다.

public Coroutine LoadCharacterAsync(CharacterData data)
{
    return StartCoroutine(LoadCharacterAsyncRoutine(data));
}
  
IEnumerator LoadCharacterAsyncRoutine(CharacterData data)
{
    GameObject characterObject = new GameObject();
    PokoCharacter character = characterObject.AddComponent<PokoCharacter>();
     
    // 캐릭터를 구성하는 각 파츠의 SkinnedMesh를 읽어서 생성
    for(int i = 0; i < 3; ++i)
    {
        GameObject loadedParts = null;
  
        yield return StartCoroutine(LoadCharacterPartsRoutine(data.partsName[i]);
  
        // 위 코루틴의 결과값을 어떻게 받지?!
        character.AddParts(i, loadedParts);
    }
}
  
IEnumerator LoadCharacterPartsRoutine(string partsName)
{
    // Mesh, Texture, Bone, Animation 등등 로딩
}

혹시나 이런 게 되나 싶었는데

IEnumerator LoadCharacterPartsRoutine(string partsName)
{
    // Mesh, Texture, Bone, Animation 등등 로딩
    return loadedParts;
}

될 리가 없죠;; 

IEnumerator로 선언된 메소드 내에서는 ref, out 같은 키워드도 문법적으로 사용할 수 없습니다. 

해서 구글링을 해 봤더니 C#의 람다를 콜백으로 사용하는 신박한 방법이 있더라구요. 

IEnumerator LoadCharacterPartsRoutine(string partsName)
{
    // Mesh, Texture, Bone, Animation 등등 로딩
    return loadedParts;
}