(유니티3D)비동기 씬 로딩에 대해
로딩 관련 글을 쓰고 나서 말 나온 김에 궁금했던걸 전부 해결해보고자 이것저것 테스트 해봤습니다.
일단 가장 먼저 tree-sha는 빌드가 너무 오래걸려 테스트에는 적합하지 않은 거 같아 Icicle Game을 이용하기로 했습니다.(그래서 카테고리도 옮겼고 옮기는 김에 안 쓸거 같은 문제랑 해결도 바꿨습니다.)
하지만 Icicle Game은 애초에 로딩 시간이 매우 짧은 게임이라 tree-sha처럼 아예 다른 씬을 건너가는 방식은 어중간하게 연출할 시 오히려 미관을 해칠 우려가 있어 다른 방법을 사용하기로 했습니다.
다른 모바일 게임에서도 자주 볼 수 있는 로딩창입니다.
제가 하는 게임인 '소녀전선'과 '시드이야기'를 예시로 들겠습니다.
일단 두 게임 다 위 화면이 뜨는 경우는 게임 도중 서버의 응답을 기다리는 로딩화면입니다.
로딩을 하게 되면 별도의 씬을 거치지 않고 저 화면만이 현재 화면 위에 떳다 사라집니다.
서버 응답 대기처럼 로딩 소요시간도 불확실하고 씬의 전환도 일어나지 않는 경우에 쓰기 좋아보입니다.
씬이 전환되는 Icicle Game에는 그리 적합하지 않습니다만 애초에 현재 상태는 로딩조차 없는데다 공부 목적이기에 일단은 이 방법을 쓰기로 했습니다.
아무리 현재 화면에서 추가로 띄운다곤 해도 모든 씬에 저 로딩 화면을 추가하는 것은 비효율적이겠죠.
그래서 어쨌든 로딩 전용씬을 만들어줄 필요가 있습니다.
짠! 완성 됐습니다.
기존 씬들이 UI를 활용하고 있기에 똑같이 UI로 만들어줍니다.
사실 이렇게 안하면 기본 상태일 시 무조건 제일 앞에 나오는 UI 특성상 로딩 화면이 기존 씬의 UI에 가려져서 안보이게 되는 불상사가 발생합니다.
여기서 디자인적인 부분은 저에게 있어 별로 중요하지 않으니 필요한 기능만 넣었습니다.
배경으로 반투명한 검은색을 깔았습니다. 뒤에 있는 기존 씬의 버튼들이 눌리는 것을 막아주고 로딩 중임을 전체적으로 그려줍니다.
로딩 수치가 숫자로 표시되고 그것이 프로그레스바로 그려집니다.
그리고 그 수치가 전부 차게 되면 목표로 했던 씬으로 넘어갑니다.
위에 있는 동전은 냅두면 빙글빙글 돕니다. 로딩 도중에 로딩 외의 다른 동작도 하는지 보기 위해서 넣었습니다.
준비는 끝났고 이제 로딩 테스트를 할 때입니다.
앞서 다른 글에도 쓴 적이 있는데 비동기 로딩의 경과는 잘 표시 되는지, 그리고 다음 씬의 Awake 스크립트도 로딩해 주는지도 알아봐야겠죠.
먼저 이 로딩이 표시되는 화면은 이렇습니다.
인트로 화면이 살짝 어두워졌고 위에 로딩 씬이 뜨고 있군요.
컴퓨터로 로딩화면을 보면 1초도 안되서 로딩이 끝납니다. 고로 위 화면은 살짝 조작을 가한 후에 찍었습니다.
어쨌든 그냥 떠오른대로 구현했는데 생각한데로 적용 되었습니다.
비록 찰나의 시간이지만 로딩하는 순간 위 화면이 뜨고 로딩 수치가 차오른 후에 바로 다음 씬으로 전환됩니다.
그럼 이제 알고싶었던 것을 확인해보겠습니다.
비동기 로딩의 경과는 잘 표시 되는지 봐야죠.
근데 문제가 있습니다. 컴퓨터라 너무 빨라서 그런건진 몰라도 수치가 0 -> 90 -> 전환 순을 거치고 끝납니다.
그 사이는 전혀 보이지 않고 몇 번을 해도 0 -> 90 -> 전환 순만을 거칩니다.
사이가 안 보이는건 그렇다쳐도 왜 90인지는 도저히 모르겠습니다.
이 부분에 대해 계속 찾아봤지만 대부분 0.9 = 1 라는 공식으로 사용하고 있더군요.
실제로 디버그 로그를 찍어보면 0.9에서 더 이상 오르지 않는 것을 확인할 수 있긴 합니다.
하지만 그건 유니티가 그럴뿐 보이는게 90에서 멈추면 보기 좋지 않기에 *= 1.1f 를 해줍니다.
그러면 본인의 수 처리에 따라 99%가 되든 100%가 되든 좀 더 그럴싸한 수치까지 도달 한 다음 다음으로 넘어 갈 것입니다..
이제 미관상 안 좋은 것은 고쳐졌는데 여전히 0 -> 99 -> 전환 과정이 일어납니다.
너무 빨라서 중간 과정이 보이지조차 않는걸까요?
그래서 임의로 로딩 시간을 늘려봤습니다.
불러오려는 씬의 한 스크립트 중 Awake에서 아무거나 인스턴스 오브젝트 생성을 5만번 하도록 해봤습니다.
그러자 로딩 시간이 확 늘었습니다. 몇 초나 더 지나야 씬이 전환 됩니다.
근데 여기서 몇 가지를 더 확인 할 수 있었습니다.
알 수 있는 것은 총 3개였습니다.
1. 스크립트 로딩도 비동기 로딩에 들어간다는 것
2. 스크립트 로딩은 99%(혹은 100%)에 걸린 채로 이루어 진다는 것
3. 로딩하는 동안엔 동전이 돌지 않는다는 것
입니다.
스크립트 로딩도 비동기에 포함 되는 것을 확인 할 수 있던건 이득이었습니다. 어차피 알아보려 했던거였구요.
근데 그 로딩이 99% 상태에서 진행된다는 것은 좀 문제가 있었습니다. 더 자세히 알아봐야 하겠지만 현 상태로는 로딩 경과를 보여주는 창이 제 역할을 전혀 못 하고 있다는 뜻이 됩니다.
그리고 동전이 돌지 않는 다는 것은 기존의 씬 전환과 비슷하게 그냥 멈춤 상태나 다름 없다는 뜻이 됩니다. 저 로딩 씬은 경과를 보여주는게 아닌 단순 로딩 중입니다를 알리는 역할 밖에 못 한다는 말이구요.
이 글을 작성하는 순간 알아낸 것은 이게 전부입니다.
수확으론 처음 시도해본 것이지만 의도대로 된 로딩 씬과 비동기 로딩에 포함되는 스크립트 로딩인데
의문으로는 경과율과 로딩 중 정지가 있겠네요.
로딩 중에 정지가 된다는 건 비동기의 메리트가 없어진 것과 다름 없다고 생각 되는데 이 부분을 좀 더 알아보고 해결하면 경과율 표시도 조금은 개선될 거 같습니다.
참고로 모바일로 빌드하여 확인해보니 모바일은 10~20% -> 99% -> 전환 의 과정을 거쳤습니다.
10~20% 는 저 사이에 랜덤하게 걸리고 멈췄다 99%가 되고 전환된다는 소리입니다.
일단 로딩 중 완전 정지되는 현상만 해결할 수 있으면 경과율은 1차적으로 원하는 모습을 확인 할 수 있을 거 같습니다.
ps. 너무 길어질거 같은데다 아직 해결해야 할 문제가 있어 일단 소스코드는 따로 적지 않았습니다. 혹시라도 필요하신 분이 계시다면 추가하고 관련하여 더 상세히 적도록 하겠습니다.(아니면 훗날 여유가 생기면 알아서 적겠습니다.)
'Icicle Game (2D) > 발전' 카테고리의 다른 글
1.02버전 업데이트 (0) | 2017.12.11 |
---|---|
패치 예정 (0) | 2017.12.11 |
(유니티3D)OnCollisionEnter/Stay/Exit 사용시 주의점 (0) | 2017.12.11 |
(유니티3D)비동기 씬 로딩에 대해3 (0) | 2017.12.09 |
(유니티3D)비동기 씬 로딩에 대해2 (0) | 2017.12.08 |