언리얼 서브 레벨 스트리밍


언리얼 공식문서 : https://docs.unrealengine.com/latest/KOR/Engine/LevelStreaming/HowTo/StreamWithVolumes/index.html




 언리얼로 게임을 만들 때 하나의 씬에 굉장히 많은 스타틱 메쉬 액터들이 존재할 경우, 과부하가 많이 걸리게 됨.

또한 로딩도 오래걸리는 편이라서, 씸리스 게임을 만들기엔 레벨 스트리밍이 반드시 필요함.


 서브 레벨 스트리밍은 중심이 되는 Persistant 레벨이 있고 (기존 사용하던 레벨의 개념), 

여기에 추가적으로 서브 Streaming 레벨이 존재하여 상황에 따라 로드 / 언로드되는 것.


 하늘이나 어느 위치에서나 보이는 먼 배경 같은 경우에는 Persistant Level에 할당하고,

특정 상황에서 더이상 보이지않거나 특정구역을 지나기 전까지는 보일 일이 없는 경우 

개별적으로 Streaming Level을 만들어 줘야함. 




1. Streaming Level 만들기

 - Window - Levels 창에 들어가서



 - 열린 Level 창에서 왼쪽 위의 Levels 버튼을 누르고 Create New를 누르면 새로운 서브레벨이 생성된다.



 - 퍼시스턴트 레벨에서 스트리밍 레벨로 분리하고 싶은 액터들을 모두 선택하고, 오른쪽클릭하여 Levels - Move Selection to Current Level로 스트리밍 레벨로 보낼 수 있다.






2. Streaming Level 만들기

 - Window - Levels 창에 들어가서 표시되는 Level의 이름을 두번클릭하는 것으로 현재 활성화된 레벨을 변경할 수 있다. 오른쪽아래에 표시된 이름이 바뀜.



 - 서브레벨로 바꾼다고 하더라도 Persistant 레벨 자체는 서브레벨에서도 언제나 존재하는 것이기 때문에 따로 꺼지지는 않는다.

 - 서브레벨이 활성화된 상태에서 새로운 액터를 생성하면 해당 서브레벨에 생성된것으로 간주한다.


 - 월드 아웃라이너의 화살표를 눌러서 라벨을 Level로 변경하면 어느 레벨에 속한지 볼 수 있다.





3. 서브 레벨 on off 하기

 - 두 가지 방법이 존재하는데, '레벨 스트리밍 볼륨'과 '블루프린트로 직접 로드' 하는 방법이다.



3-1. 레벨 스트리밍 볼륨

 - 레벨 스트리밍 볼륨은 Modes 탭에서 생성가능.

 - 반드시 Persistant Level에 존재해야한다.



 - 플레이어가 볼륨에 들어가면 레벨을 로드하고, 볼륨에서 나가면 볼륨 언로드.

 - 볼륨의 경계면을 겹쳐놓는다면 Seamless 맵을 구현가능. 불륨과 볼륨사이를 지나는 구간에서 자연스럽게 연결됨


 - 스트리밍 볼륨을 생성한 뒤, 레벨 창에서 detail tap을 연다.



 - Streaming Volumes를 할당.



 - 창을 닫고, 다시 아웃라이너로 돌아와서 Streaming Volume 액터의 속성 중 

    Editor Pre Vis Only 와 Disabled 박스 체크는 해제 

    Streaming Usage를 SVB Visibility Blocking On Load로 변경한다.




3-2. 블루프린트로 직접 로드

 - 원하는 타이밍에 Load Stream Level 노드와 Unload Stream Level 노드를 활용하면 끝.

 - 주로 서브 레벨이 있지만 자연스런 연결이 필요없는 구간에서 사용한다. (막힌 공간)


   





4. 주의점

 - Streaming Volume은 캐릭터 기준이 아니라 카메라 기준. 카메라랑 캐릭터가 떨어져있을경우 주의

 - 테스트용으로 엔진에서 바로 실행할경우 기본적으로 다 로딩이 되어있고 플레이에서는 Visibility만 ON OFF 하게된다. 스탠드얼론으로 해야 로드 언로드 타임도 체크가능.

 - 레벨끼리의 오프셋은 Level Details에서 Position을 통해 줄 수 있다. 이건 수치가 더해지는거라서 서브레벨을 쓸 때에는 스폰 위치등을 절대좌표를 사용하지말 것. 

 - NavMesh가 제대로 작동안할 경우 프로젝트 셋팅 - NavMesh에서 Dynamic으로 바꾸고, Path Build 랑 Geometry Build 시도.

 - 레퍼런스를 사용할 때, 로딩이 되있지않을경우를 상정해야한다.

   https://answers.unrealengine.com/questions/468231/how-to-check-if-level-instances-have-finished-load.html

   https://answers.unrealengine.com/questions/204137/473-level-streaming-not-working-properly-in-multpl.html

댓글

Designed by JB FACTORY