인프런 커뮤니티 질문&답변

LEETO님의 프로필 이미지
LEETO

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

Coroutine #2

로딩씬 전환 코르틴 질문

해결된 질문

작성

·

493

1

강의를 이해한대로 밑에 나오는 코드에 접목시켰는데..
이해가 안되서 질문합니다.ㅠㅠ    

public void LoadLevel(int sceneIndex)

    {

        StartCoroutine(LoadAsynScene(sceneIndex));

    }

   IEnumerator LoadAsynScene(int sceneIndex)

    {

        AsyncOperation op = SceneManager.LoadSceneAsync(sceneIndex);

        while (!op.isDone)

        {

            slider.value = op.progress;

            yield return null;

        }

    }

제가 이해한 바로는 yield return null를 만나면서 해당 함수 가 실행된 부분까지의 대한 정보를 저장한 후에 호출해준 곳으로 다시 돌아가게 되어 소유권이 넘어갑니다.

그리고 LoadAsynScene함수를 한번 실행 되어 이후에는 실행 되지 않아야 되는걸로 아는데 보니깐 함수를 yield return null; 에서부터 다시 실행이 되는것 같습니다....

혹시 저 위에코드는 동작방식이 어떻게 되는건가요?? 

답변 4

1

LEETO님의 프로필 이미지
LEETO
질문자

답변 감사합니다!!

강사님이 짜신 코드가 아니기에 황당한 질문이겠지만..(유튜브 Brackeys 자료 코드입니다.)

1. 혹시 저기서 yield return null를 해서 한 tick 늦춰서 실행 해주는 이유가 따로 있을까요??

2. 만약 강의에서 알려주신 yield return new WaitForSecend(4.0f); 과 같은 상황에서는 정보를 저장하고 호출한 곳으로 소유권이 돌아가 돌아간 부분의 코드를 정상적으로 실행하다가 4초 yield가 호출된 시점의 코르틴 함수로 가서 실행이 되는 건가요??

0

LEETO님의 프로필 이미지
LEETO
질문자

답변해주신 것을 보고 강의를 한번 더 들으니 이제야 완벽히 이해가 가네요^^ 
감사합니다

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

매우 중요한 부분인데요.

1. 
while (!op.IsDone)을 한 번 체크하고
아직 완료되지 않았다 싶으면 yield return으로 빠져나가서
다음 프레임에 이어서 체크를 하게 됩니다.
반면 yield return을 하지 않거나, Coroutine 방식이 아니라면
while (!op.IsDone)과 끝장승부가 나기 전까지는 절대 빠져나가지 않으니
다른 애들은 실행조차 할 수 없게 됩니다.
어떤 과제를 매일마다 10분씩 나눠서 하느냐,
아니면 밤을 새면서라도 무조건 한 번에 끝장을 보느냐의 차이라고 생각하시면 됩니다.

2.
맞습니다.
Coroutine 관리 시스템이 주기적으로 체크를 하면서
4초가 지났으면 호출하는 형태로 구현이 되어 있겠죠.

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

제가 이해한 바로는 yield return null를 만나면서 해당 함수 가 실행된 부분까지의 대한 정보를 저장한 후에 호출해준 곳으로 다시 돌아가게 되어 소유권이 넘어갑니다.

-> 이건 맞습니다.

그리고 LoadAsynScene함수를 한번 실행 되어 이후에는 실행 되지 않아야 되는걸로 아는데 보니깐 함수를 yield return null; 에서부터 다시 실행이 되는것 같습니다....

-> 이건 아닙니다. 게임으로 치면 마지막 실행 상태를 저장하고 거기서부터 이어서 실행하는겁니다.
[이후에
LoadAsynScene이 실행되지 않는 것]은 yield break을 할 때의 애기고,
지금처럼 yield return 계열로 반환하면 다음 Tick에 이어서 다음 부분이 실행됩니다.
현재 yield return null 다음에는 while (!op.isDone)이 호출되어야 하니 그 부분이 호출되겠네요.

LEETO님의 프로필 이미지
LEETO

작성한 질문수

질문하기