UDN
Search public documentation:

LevelStreamingHowToKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 레벨 스트리밍 > 레벨 스트리밍 사용하기

레벨 스트리밍 사용하기


문서 변경내역: Dave Nash 작성. Daniel Vogel 수정. 홍성진 번역.

개요


다중 레벨의 실시간 스트리밍을 조합 설정하여, 자연스러운 하나의 대규모 월드인 것처럼 만드는 법에 대한 안내서입니다.

볼륨 기반 레벨 스트리밍에 대한 내용은 Level Streaming Volumes KR 문서를 확인해 주시기 바랍니다.

퍼시스턴트(지속) 레벨


여러 레벨을 서로 자연스럽게 결합시키려면, 먼저 퍼시스턴트 레벨을 만듭니다. 스트림 인 / 아웃 대상 레벨을 제어하는 데는 주로 이 퍼시스턴트 레벨을 마스터 레벨로 간주합니다.

다음의 간단한 단계별 작업으로 퍼시스턴트 레벨을 생성하고 스트리밍 레벨을 추가할 수 있습니다:

  1. 새 맵을 생성하고 보이지 않는 어딘가에 작은 큐브 지오메트리를 추가합니다. (이렇게 하면 엔진이 이 레벨을 하나의 레벨로 인정을 하며, 결국 이를 없애는 단계가 있을 것입니다.)
  2. 플레이어 시작 지점에 Player Start 를 놓습니다. 퍼시스턴트 레벨에서는 이 Player Start 가 공중에 뜰 가능성이 있지만 레벨에 스트림 인 후에는 첫 번째 스트리밍 레벨에서 플레이어를 시작하고자 하는 어느 위치로나 이동할 수 있습니다. 게임을 플레이할 때가 아니라 플레이어가 퍼시스턴트 레벨이 아닌 스트리밍 레벨 중 하나의 지오메트리을 실제로 통과할 때 퍼시스턴트 레벨을 시작합니다.
  3. 맵을 저장합니다. 자체적인 관리 방식에 맞도록 퍼시스턴트 레벨 이름을 지정합니다. 예를 들어 Headquarters_P 같은 식입니다.
  4. 콘텐츠 브라우저를 열고 "레벨" 탭을 클릭합니다. 여기서 스트림 인 시키려는 모든 레벨을 나열해야 합니다. Headquarters 가 맵 셋으로 구성되었다면, 여기서 3가지를 모두 추가합니다. 메뉴에서 레벨 -> 기존 레벨 추가... 를 선택하여 추가합니다. 스트리밍 레벨을 추가하는 순서는 중요하지 않으나 앞으로는 정돈 상태 유지를 위한 레벨 재정렬이 가능하도록 할 예정입니다. 작업 결과는 아래 그림과 같을 것입니다.
  5. 레벨 스트리밍 작동방식을 거리와 키즈멧 중에서 선택할 수 있는 옵션이 주어집니다.
    • 거리 스트리밍은 레벨 원점에서 플레이어까지의 거리에 따라 레벨을 로드 / 언로드합니다.
    • 키즈멧 스트리밍은 디자이너가 키즈멧 스크립팅을 통해 마음대로 레벨을 로드 / 언로드할 수 있어 가장 일반적입니다.

예 1: 스트리밍 레벨 셋을 추가시킨 이후의 레벨 브라우저

"CURRENT(현재)"로 명명된 이 레벨은 에디터 창이나 Kismet에서 변경된 내용이 있으면 수정됩니다. 이렇게 하면 레벨 쓰기가 가능한 한 여러 맵에서 간편하게 작업할 수 있습니다. Save 버튼을 누르면 CURRENT 레벨을 저장합니다(또는 Save All Levels 버튼을 눌러 퍼시스턴트 레벨을 포함한 여기 나열된 모든 맵을 저장할 수 있습니다).

Visible 확인란은 에디터에서 레벨을 숨기거나 표시하게 할 수 있습니다. 이 확인란은 오직 표시 지정용으로, 레벨 실행 시 게임에 스트리밍되는지 여부와는 전혀 관계가 없습니다. 그러나 여기서 보이지 않는 레벨은 레벨을 다시 빌드할 경우 영향을 받지 않으므로 레벨이 복잡한 경우에는 시간을 크게 절약할 수 있습니다.

퍼시스턴트 레벨에서 스트리밍된 레벨을 완전히 제거하려면 브라우저의 Level에서 Remove level from world를 선택합니다. 레벨의 스트리밍 방법을 변경하려면 레벨을 제거한 다음 다시 추가하여 스트리밍 인을 수행할 방법을 선택합니다. 현재 "Load"와 "Unload", Lock/Unlock 아이콘, Draw Bounding Box 플래그는 작동하지 않습니다.

예 2: 마우스 오른쪽 버튼을 클릭하고 "Make Current"를 선택하여 작업 중인 레벨을 변경합니다.

퍼시스턴트 레벨 작업 방법 요약

  • 언리얼 에디터에서 새 맵을 작성합니다.
  • 큐브처럼 간단한 BSP 지오메트리를 추가합니다.
  • Player Start 를 추가합니다.
  • 레벨 브라우저에서 스트리밍하려는 레벨을 추가합니다.
  • 맵을 저장하고 이름을 지정합니다.

키즈멧을 통해 스크립트 스트리밍


위에서 상세히 설명한 것처럼 퍼시스턴트 레벨을 생성한 후에는 게임에 로드할 스트리밍 레벨을 선택할 수 있습니다. 여기에는 레벨 스트리밍(로드)과 레벨을 표시하도록 지정하는 것 등의 두 가지 부분이 있습니다. 키즈멧을 통해 레벨을 스트리밍하려면 간단히 다음 단계를 수행합니다.

  • 키즈멧을 엽니다.
  • 레벨 시작을 배치합니다(New Event -> Level Loaded).
  • 레벨과 같은 수의 Steam Level 액션을 놓습니다. (New Action -> Level -> Stream Level).
  • Stream Level 에 클릭하고 LevelName 부분에 레벨 이름을 넣어 각 레벨 이름을 추가합니다.
  • Level Loaded 를 Steam Level 액션의 각 Load 입력에 연결합니다.

이 프로세스는 퍼시스턴트 맵이 실행될 때 연결된 레벨 각각을 즉시 로드합니다. 플레이어가 월드에 들어서자마자 보게 되는 맵인 경우, 즉시 보이게 만드는 옵션(bMakeVisibleAFterLoad)도 있습니다. 로드와 동시에 보이게 하려는 스트리밍 부분에 대해서든 bShouldBlockOnLoad 도 체크하는 것이 좋습니다.

예 3: 키즈멧을 통해 세 레벨 로드

이 시점에서 퍼시스턴트 레벨을 실행시켜 스트리밍 레벨을 돌아다닐 수 있을 것입니다. 로드와 동시에 보이도록 설정만 해 뒀다면요. 퍼포먼드상의 이유로 그렇게 설정하지 않은 레벨이 있는 경우, 트리거나 다른 어떤 방법을 통해 보이게 만들 수단을 강구해야 합니다. 예를 들어 Headquarters_3 는 처음부터 플레이어한테 보이게 만들이게는 너무 멀리 있을 수 있으니, 리소스 절약을 위해 나중에 보이게 만들면 좋습니다. New Action -> Level 아래 Change Level Visibility 라는 키즈멧 액션도 있습니다. 이 액션을 통해 원하는 대로 스트리밍 레벨을 숨기고 드러낼 수 있습니다. Stream Level 액션에서 Unload 이벤트를 사용하면 레벨이 메모리에서 언로드되어 메모리 확보에 좋습니다만, 다시 보이게 만들려면 Load 이벤트를 사용해 줘야 한다는 점은 유념해 주십시오.

스크립트 스트리밍 작업 방법 요약

  • 키즈멧을 엽니다.
  • Level Loaded 액션과 StreamLevel 액션을 추가하고 Level Loaded 를 Load 입력에 연결합니다.
  • Stream Level 을 클릭하고 "LevelName" 필드에 스트리밍하려는 레벨의 이름을 넣은 다음 bMakeVisibleAfterLoad 를 체크합니다.
  • 맵을 저장하고 게임을 실행합니다.

거리 기반 스트리밍


플레이어로부터의 거리에 따라 레벨을 스트리밍하기로 선택한 경우 추가적으로 몇 단계가 더 필요합니다. 먼저 일반 브라우저에서 퍼시스턴트 레벨을 선택했는지 확인한 다음 맨 오른쪽의 WorldInfo 카테고리를 확대합니다. 보고 있는 WorldInfo_#을 마우스 오른쪽 버튼으로 클릭하고 "Edit Properties"를 선택합니다. 등록 정보 창에서 WorldInfo 등록 정보를 연 다음 StreamingLevels 등록 정보를 엽니다. 여기에 각각의 스트리밍 레벨이 표시될 것입니다. 이제 레벨이 스트리밍 인될 플레이어로부터의 거리를 MaxDistance 필드에 설정할 수 있습니다. 기본적으로 레벨의 세계 공간에서 원점이 0,0,0인 구면을 가정해 보겠습니다. 플레이어가 이 구면에 들어오면 레벨이 스트리밍 인되고 이 구면을 나가면 언로드됩니다. 대부분의 경우 스트리밍 인하고자 하는 레벨을 이 구면이 완전히 둘러싸기를 바라기 때문에 이 구면의 위치는 변경될 수 있으며 대부분 변경이 필요합니다. 따라서 레벨에 가까이 가면 로드되고 레벨 직접 영역을 나가면 언로드됩니다. 이러한 구면의 존재를 시각화하는 방식을 추가할 계획이지만 아직 구현되지 않았습니다.

이러한 스트리밍 방법은 플레이어와 레벨 간의 거리에 따라 레벨을 무수히 로드 및 언로드하려는 상황에 유용합니다. 대용량 맵인 경우 레벨이 표시되거나 숨겨지는 것이 아니라 실질적으로 스트리밍 인 및 아웃될 때 레벨 로드 시 눈에 띄는 중지가 발생할 수도 있습니다.

예 4: 거리 기반 스트리밍 설정

거리 스크립팅 작업 방법 요약

  • 콘텐츠 브라우저를 엽니다.
  • 레벨 탭을 클릭합니다.
  • 콘텐트 브라우저의 파일 메뉴에서 Level -> New From File 을 선택하고 스트림 인 시킬 레벨을 선택합니다.
  • "Distance" 스트리밍을 선택합니다.
  • "Persistent Level"을 선택했는지 확인하고 오른쪽의 WorldInfo 등록 정보를 펼칩니다. WorldInfo_#을 마우스 오른쪽 버튼으로 클릭하고 "Edit Properties"를 선택합니다.
  • 표시되는 프로퍼티 창에서 WorldInfo 를 펼친 다음 StreamingLevels 를 펼칩니다.
  • 플레이어와의 거리가 얼마나 되어야 레벨을 월드에 스트림 인 시킬 것인지 그 거리를 입력하고, 거리 측정을 위한 원점 위치를 월드 스페이스상의 위치로 변경합니다.

스트리밍 레벨 작업


로드와 이벤트

일반적으로 레벨 로드시 여러가지 이벤트가 돌아가는 Level Startup 액션을 대체하기 위해 새로운 키즈멧 액션이 추가되었습니다. 그 이름은 Level Loaded And Visible 입니다. 기본적으로 Level Startup 과 같은 방식으로 작동하나, Change Level Visibility 액션과 함께 작동되도록 고안되었습니다. CLV 액션을 통해서든 bMakeVisibleAfterLoad 플랙 체크 상태로 스트림 인 시켜서든, 레벨이 플레이어에게 보이게 되면 이 Loaded And Visible 액션이 발동됩니다. 여기에 Remote Events 와 결합시켜, 필요에 따라 로드 / 언로드는 물론이고 다른 스트리밍 레벨과 이벤트를 주고받을 수 있도록 하기 위해, 각 스트리밍 레벨을 독립적인 개체로 만듭니다. 아래 그림은 주 레벨이 보이게 되자 마자 플레이어를 텔레포트시키고, 다른 레벨의 Remote Event 가 발동되었을 때 크리처를 스폰시키기도 하는 예입니다.

예 5: 스트리밍 레벨 스크립트 예

레벨 간 액터 이동

2007년 12월 QA 승인 빌드 이후, 한 레벨에서 액터를 복사(Ctrl + C)하고 현재 레벨을 변경하고 붙여넣기(Ctrl + V)하면 간단히 레벨 간 액터 이동이 가능합니다. 그러나 이는 액터 간 참조에 따라 생길수 있는 문제 해결을 위해 새로운(scratch) 월드로 serialize 시켜야 한다는 점에서, MoveSelectedActorsToCurrentLevel 과 비슷한 방법을 사용합니다. 이 함수성은 changelist #203995, #206418 에 도입되었습니다.

2007년 1월 QA 승인 빌드 이전에는 대규모 액터를 한 번에 이동할 때 메모리 부족 오류가 발생할 수 있었으나 에디터 트랜잭션 버퍼의 성능(및 메모리 사용량)을 개선하여 이를 해결했습니다(changelist #206829).

또한 2007년 1월 QA 승인 빌드에서는 레벨 브라우저New Level from Selected Actors 버튼을 사용하여 액터를 새 레벨로 이동할 수 있습니다 (changelist #206324).

최적화

대부분 개발자들은 퍼포먼스와 작업방식 두 가지 면 모두에 있어서 스트리밍 레벨은 다다익선이라는 것을 알게 될 것입니다. 그러나 현재 시스템의 제한 요소 한 가지 때문에 좌절을 겪게 되는데, 그것은 뭐냐면 어느 한 레벨에 놓은 액터를 다른 레벨에서 키즈멧으로 직접 참조할 수 없다는 것입니다. 원격 이벤트를 발동시키고 수신하여 스트리밍 레벨 사이의 이벤트를 트리거시킬 수는 있지만, 여기서 다른 레벨 사이의 액터를 직접 참조할 수는 없는 것입니다. 위의 그림에서 보면 Pathnode_0 과 Pathnode_1 은 이 스크립트의 같은 레벨, 이 경우 Headquarters_2 에 있어야 합니다. 그 노드 중 하나라도 HQ_1 이나 3 에 있었다면, 이 액션들은 기능을 상실하게 됩니다.

2007년 12월 QA 승인 빌드 이후로, 기존 레벨을 스트리밍 덩어리로 쉽게 잘라주는 기능이 추가되었습니다.

  • 월드의 액터를 한 다발 선택합니다.
  • 레벨 브라우저의 레벨 에서 선택 액터로부터 새 레벨 을 선택합니다.
  • 디스크에 새로운 스트리밍 레벨이 생성되어 월드에 추가되며, 그 후 선택된 액터가 그 새 레벨로 이동됩니다.

작은 스트리밍 레벨로 쪼개 만드는 작업이 편해집니다!

스트리밍 볼륨


볼륨 기반 레벨 스트리밍에 대한 내용은 Level Streaming Volumes KR 페이지를 참고하시기 바랍니다.

결론


지금까지 게임 월드에 레벨을 동적으로 스트림 인 / 아웃 시키는 법에 대해 알아봤습니다. 이 기능은 여러모로 새로 도입되고 지속적으로 업데이트되고 있는 부분이니, 그 때마다 이 문서가 업데이트되겠거니 기대하셔도 좋습니다.