장면 간 부드러운 로딩 화면


14

다음 장면이 로딩 될 때 로딩 애니메이션을 표시하기 위해 로딩 화면을 만들었습니다. 다음 장면을 비동기식으로로드합니다.

yield return SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive);

또한 설정 Application.backgroundLoadingPriority = ThreadPriority.Low;하지만 동작은 여전히 ​​일반 레벨로드와 동일합니다.

뭔가 빠졌습니까?

예상되는 행동 :

  • 출구 레벨에서 퇴색합니다.
  • 로딩 화면이 나타납니다.
  • 로드가 완료되면 로딩 화면이 사라집니다.
  • 다음 장면에서 희미 해집니다.

일어나고있는 일 :

  • 출구 레벨에서 퇴색합니다.
  • 로딩 화면이 나타납니다.
  • 갑자기 새로운 장면이 사라집니다.

로드가 시작되면 일반 장면로드와 같이 게임이 프레지입니다.

난 당신이 세트에있는 것을 읽어 allowSceneActivation = false당신은 로딩 화면을 페이드 아웃 할 수 있도록하고 그것을 설정 true단결 마무리 로딩을 수 있도록하지만, 비동기 작업로드가 완료 결코처럼이 completelly, 내 게임을 정지.


나는이 문제가 있었고 여기서 아무것도 찾지 못했습니다. 인터넷 검색 후이 문제의 원인을 발견했습니다. 다른 사람들이 쉽게 답을 찾을 수 있도록 여기에 게시하기로 결정했습니다. 내 답변 / 질문에 개선 사항을 추가 할 수 있는지 알려주십시오. 감사!
레오

답변:


18

장면을로드하면 SceneManager.LoadSceneAsync()실제로 두 가지 일이 발생합니다.

  • 장면의 게임 오브젝트가 메모리에로드됩니다.
  • 그런 다음 전체 장면이 활성화됩니다. 장면의 객체에 대해 모든 Awake () 및 Start () 콜백이 호출됩니다.

씬을 활성화하는 두 번째 단계는 유니티가 스크립트에서 모든 초기화 콜백을 단일 주기로 실행하기 때문에 실제로 유니티를 정지시키는 것입니다.

참으로 설정 SceneManager.LoadSceneAsync().allowSceneActivation하는 false비동기 작업이 과정의 첫 번째 단계를 완료하고,이 설정 될 때까지 대기하게됩니다 true프로세스의 두 번째 부분을 시작합니다.

사용자가 설정하지만 만약 allowSceneActivationfalse이 같은 콜백에 수율, 당신은 영원히 당신의 게임을 동결 :

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
yield return AO;

//Fade the loading screen out here

AO.allowSceneActivation = true;

왜? 장면로드의 두 번째 단계를 진행하지 않도록 비동기 작업에 지시하므로 작업이 완료되지 않습니다.

작업의 첫 부분이 언제 준비되었는지 알고 싶다면 두 번째 부분을 진행하려면에 의존해야합니다 AsyncOperation.progress. 이 값은 플래그를 0.9f기다리는 즉시 중지됩니다 allowSceneActivation.

다음과 같아야합니다.

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
while(AO.progress < 0.9f)
{
    yield return null
}

//Fade the loading screen out here

AO.allowSceneActivation = true;

장면 활성화로 인해 게임이 정지되지 않게하려면 Awake 및 Start 콜백을 미니 문에 유지하고 여러주기 동안 코 루틴으로 스크립트를 초기화해야합니다.


0

Unity 5.6에서도 똑같은 문제가 있었으며 이미 yield 문을 추가하려고했습니다. LoadSceneAsync 자체가 Unity의 메인 스레드를 차단하고 현재 장면에서 로딩 진행 상황을 멋지게 표시하지 못하게했습니다.

내가 알 수있는 한 Unity의 버그 인 것 같습니다. 장면이 덜 복잡했을 때 코드가 훌륭하고 부드럽게 전환되었습니다. 일단 커지면 Unity는 약 6 초 동안 스레드를 차단했습니다.

내가 문제를 해결하는 방법은 내 조명을 보는 것입니다. 과거에는 조명과이 기능에 대한 거대한 버그가있었습니다. 그래서 나는 물건을 훑어 봤는데 한 물체에 스포트라이트가 있음을 발견했습니다 (비활성화되었지만 ...)

스포트라이트를 삭제하고 만세! 장면이 제대로 비동기 적으로로드됩니다! 잠금이 없습니다!


편집하기 전에이 게시물은 실제로 문제에 대한 해결책을 제공하지 않았습니다. 이제 수정 사항을 추가 한 것이 좋습니다. 그러나 나중에 "이 문제가 있습니다."라고 말하려는 경우 해당 목적으로 답변을 사용해서는 안됩니다. 약간의 담당자를 얻으면 기존 게시물에 댓글을 달거나 새로운 답변을 장려하기 위해 질문에 현상금을 넣을 수 있습니다.
DMGregory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.