언어:
페이지 정보
엔진 버전:
언리얼 엔진

데이터스미스 임포트 프로세스 사용자 정의

언리얼 엔진

데이터스미스 임포트 프로세스의 목표는 외부 콘텐츠 제작 툴에서 구성한 3D 오브젝트 세트를 언리얼 에디터로 부드럽게 가져오는 것입니다. 그러기 위해 메시, 라이트, 카메라, 표면 머티리얼의 원래 의도를 잘 살려 언리얼 엔진에서 그에 해당하는 오브젝트로 자동 변환하고, 그 애셋의 인스턴스를 레벨에 자동으로 채웁니다. 자세한 내용은 데이터스미스 개요NEW! 문서를 참고하세요.

하지만 가끔 임포트 프로세스 내부로 들어가 원본 씬을 언리얼 엔진 애셋으로 변환하는 방법이나, 그 애셋에 실제 하는 작업을 변경하고 싶을 때가 있습니다. 예를 들어 원본 씬 중 언리얼 엔진 프로젝트에 필요치 않은 부분을 알고 있으면, 그 오브젝트는 필터로 걸러낸 뒤 애셋을 만드는 것이 좋습니다. 그러면 언리얼 에디터에서 처리해야 하는 콘텐츠 조각 수를 줄이고, 큰 씬의 임포트 속도를 높일 수 있습니다.

여기서는 데이터스미스 임포트 프로세스를 제어하기 위해 블루프린트와 Python 스크립트를 사용하는 법을 살펴봅니다.

임포트 프로세스의 이해

툴바의 임포트 버튼을 통해 데이터스미스로 씬을 임포트할 때, 데이터스미스 콘텐츠를 언리얼 엔진 4 에 임포트 문서의 설명대로 임포터는 내부적으로 2 단계 과정을 거쳐 디스크의 .udatasmith, CAD, 다른 소스 파일에 있는 데이터를 가져와 언리얼 에디터의 애셋과 액터로 변환합니다.

  1. 임포터는 파일의 콘텐츠를 읽어 Datasmith Scene (데이터스미스 씬)이라는 메모리 내 데이터 구조체로 만듭니다. 여기에는 씬의 3D 오브젝트 표현, 그 관계, 데이터스미스가 원본 씬에서 추출할 수 있었던 그 오브젝트의 프로퍼티 전부가 들어갑니다.

  2. 데이터스미스 씬이 메모리에 준비되면, 임포트 프로세스의 두 번째 단계에서 씬 요소를 마무리하여 콘텐츠 브라우저의 언리얼 엔진 애셋으로 저장합니다. 데이터스미스 씬 애셋이 준비되면, 임포트 프로세스는 현재 레벨에 스폰합니다. 그리고 이어서 액터, 스태틱 메시 액터, 라이트, 카메라 등 그 자손 전부를 스폰합니다.

2단계 데이터스미스 임포트 프로세스
1: 파일에서 씬 생성, 2: 씬 임포트

임포트 프로세스 사용자 정의 옵션

툴바의 임포트 버튼이 아닌 블루프린트 또는 Python 스크립트를 사용하여 데이터스미스 임포트 프로세스를 실행할 때, 위 프로세스를 두 단계로 나눠 별도로 실행할 수 있습니다. 그러면 데이터스미스 씬을 메모리에 구성한 이후, 하지만 그 씬을 마무리하여 애셋과 액터로 저장하기 전에 별도의 프로세스를 삽입할 수 있습니다.

전반적은 프로세스는 블루프린트와 Python 둘 다 똑같습니다.

  1. 디스크의 .udatasmith 또는 CAD 파일에서 메모리 내 데이터스미스 씬 표현을 새로 만듭니다. 참고로 사용하는 블루프린트 노드와 Python 오브젝트는 임포트 대상이 .udatasmith 파일인지 CAD 파일인지에 따라 살짝 달라집니다. 하지만 두 씬 표현 모두 씬 수정 능력은 같습니다.

  2. 씬을 언리얼 애셋으로 변환하는 방식에 영향을 주고자 하는 씬 수정사항을 추가합니다.

    변경해야 하는 오브젝트를 알아내기 쉬운 방법 한 가지는 씬의 오브젝트 관련 메타데이터를 활용하는 것입니다. 데이터스미스 씬의 메타데이터에 액세스하는 방법 관련 자세한 내용은 데이터스미스 메타데이터 사용법NEW! 문서를 참고하세요.

  3. 임포트 프로세스의 옵션을 설정합니다. 이 옵션은 기본적으로 데이터스미스 임포트 버튼을 눌러 임포트를 시작할 때 언리얼 에디터 UI 에서 설정하는 옵션에 해당하는 것입니다. 예를 들어 임포트한 애셋을 프로젝트 어디에 저장할지, 데이터스미스 씬에서 어떤 오브젝트 유형을 생성할지, 파라미터형 CAD 포맷의 테셀레이션 세팅은 어떻게 할지 등을 설정합니다.

  4. 임포트 프로세스를 완료하여 데이터스미스 씬을 마무리하고 언리얼 애셋으로 저장합니다.

  5. 위에서 생성한 데이터스미스 씬이 더이상 필요치 않으면, 씬을 소멸해야 그 메모리 리소스를 확보할 수 있습니다.

  6. 임포트 프로세스가 완료되었으니, 콘텐츠 브라우저에 새로운 애셋을 사용하고 현재 레벨에 새 액터를 사용할 수 있을 것입니다 (임포트 옵션에 추가하도록 요청한 경우입니다). 생성된 언리얼 애셋에 콜리전 데이터 또는 LOD 를 자동 생성하는 등의 후처리 작업을 추가하려는 경우, 바로 여기서 하면 됩니다. 에디터 자동화 및 스크립트 작성NEW! 문서도 참고하세요.

임포트 프로세스 사용자 정의는 데이터스미스 개요NEW! 문서에 설명된 리임포트 프로세스에 영향을 줄 확률이 매우 높습니다. 예를 들어 임포트 프로세스를 완료하기 전 스크립트를 사용하여 데이터스미스 씬에서 메시나 라이트같은 요소를 제거한 경우, 데이터스미스 씬 애셋을 리임포트할 때 그 전처리 스크립트는 리임포트 도중 생략됩니다. 그 결과 원래 씬에서 필터로 거른 오브젝트가 새로 추가된 것으로 감지되어, 프로젝트 또는 레벨에 추가됩니다.

현재 대부분의 수정은 임포트 이후, 에디터 자동화 및 스크립트 작성NEW! 문서에 설명한 툴과 기법을 사용할 것을 권장합니다. 임포트 도중 데이터스미스 씬을 수정하는 것은 임포트 마무리 이후 애셋과 액터를 수정해서는 할 수 없는 작업이 있을 때, 예를 들면 특정 애셋의 생성을 막고자 하는 경우입니다.

시작하기 전에

예제

블루프린트 및 Python 을 사용하여 .udatasmith 및 CAD 파일을 언리얼 에디터로 임포트하는 프로세스를 사용자 정의하는 방법 예제는 다음과 같습니다.

구현 방법을 선택하세요:

Blueprints

Python

블루프린트를 사용하여 임포트 프로세스를 사용자 정의하려면, 주로 Datasmith > SceneDatasmith > Element 카테고리의 노드를 사용하면 됩니다.

이 노드를 사용하려면 컨텍스트 메뉴의 Context Sensitive (컨텍스트에 따라) 체크박스를 해제하거나, 팔레트에서 노드를 찾으면 됩니다. 추가로 에디터 전용 베이스 클래스, 즉 PlacedActorUtilityBase 같은 것에서 블루프린트 클래스를 파생해야 합니다.

블루프린트에서 데이터스미스 파일과 CAD 파일 사용할 때의 큰 차이점은 다음과 같습니다.

  • Construct Datasmith Scene, Import Scene 같은 몇 가지 노드에 이름은 같지만 다른 유형 오브젝트에 작동하는 두 가지 변종이 있습니다. 데이터스미스 파일 작업을 하는 경우 주의해서 Datasmith Scene 오브젝트에 작용하는 씬 노드를 사용해야 합니다. CAD 파일 작업을 하는 경우, Datasmith CAD Scene 오브젝트에 작용하는 오브젝트를 사용하세요.

  • CAD 씬의 경우, 임포트를 마무리할 때가 아닌 씬을 생성할 때 대상 디렉터리를 지정합니다.

  • 임포트 옵션은 다른 방식으로 설정합니다. 자세한 내용은 아래 예제를 참고하세요.

두 경우 모두 데이터스미스 씬 작업용 스크립트 나머지와 씬 안의 요소는 똑같습니다.

대상 폴더는 /Game/ 으로 시작해야 합니다.

데이터스미스 씬

데이터스미스 CAD 씬

Python 을 사용하여 임포트 프로세스를 사용자 정의할 때 시작하기 좋은 곳은 unreal.DatasmithSceneElementunreal.DatasmithCADSceneElement 클래스입니다. 이 클래스에는 파일에서 씬을 생성하고 그 씬의 요소를 (unreal.DatasmithSceneElementBase 공유 베이스 클래스에 정의된 함수를 통해) 작업한 뒤, 임포트를 마무리하기 위해 필요한 모든 함수가 들어있습니다.

Python 에서 데이터스미스 파일과 CAD 파일을 사용할 때 주요 차이점은 다음과 같습니다.

  • 시작점은 unreal.DatasmithSceneElement 또는 unreal.DatasmithCADSceneElement 입니다.

  • unreal.DatasmithCADSceneElement 의 경우, 임포트를 마무리할 때가 아닌 씬을 생성할 때 대상 디렉터리를 제공해야 합니다.

  • 임포트 옵션은 다른 방식으로 구성합니다. 자세한 내용은 아래 예제를 참고하세요.

두 경우 모두 데이터스미스 씬과 그 안의 요소 작업을 위한 API 는 똑같습니다.

데이터스미스 씬

ds_file_on_disk = "C:\\scenes\\studio.udatasmith"
ds_scene_in_memory = unreal.DatasmithSceneElement.construct_datasmith_scene_from_file(ds_file_on_disk)

if ds_scene_in_memory is None:
    print "Scene loading failed."
    quit()

# 씬의 데이터를 필터로 걸러내거나 요소를 합치도록 수정합니다...

# 메시 이름에 특정 키워드가 포함된 것을 제거합니다.
remove_keyword = "exterior"
for mesh in ds_scene_in_memory.get_meshes():
    mesh_name = mesh.get_element_name()
    if remove_keyword in mesh_name:
        print("removing mesh named " + mesh_name)
        ds_scene_in_memory.remove_mesh(mesh)

# 위에서 제거한 메시를 가리키는 메시 액터가 있으면 씬에서 제거합니다.
for mesh_actor in ds_scene_in_memory.get_all_mesh_actors():
    mesh_reference = mesh_actor.get_mesh_element()
    if mesh_reference is None:
        print("removing an actor with a missing mesh: " + mesh_actor.get_element_name())
        ds_scene_in_memory.remove_mesh_actor(mesh_actor)

# 임포트 옵션을 설정합니다.
options = unreal.DatasmithImportBaseOptions()
options.scene_handling = unreal.DatasmithImportScene.NEW_LEVEL

# 애셋과 액터를 생성하는 것으로 프로세스를 마무리합니다.

# 대상 폴더는 /Game/ 으로 시작해야 합니다.
ds_scene_in_memory.import_scene("/Game/MyStudioScene", options)

# 데이터스미스 씬을 정리합니다.
ds_scene_in_memory.destroy_scene()
print "Custom import process complete!"

데이터스미스 CAD 씬

import unreal

# 디스크의 파일에서 데이터스미스 CAD 씬을 생성합니다.
# 대상 폴더는 /Game/ 로 시작해야 합니다.
ds_file_on_disk = "C:\\designs\\Clutch assembly.SLDASM"
ds_scene_in_memory = unreal.DatasmithCADSceneElement.construct_datasmith_scene_from_file(ds_file_on_disk, "/Game/MyCADScene")

if ds_scene_in_memory is None:
    print "Scene loading failed."
    quit()

# 씬의 데이터를 필터로 걸러내거나 요소를 합치도록 수정합니다.
remove_keyword = "_BODY"         # 이름에 이 문자열이 있는 액터는 제거합니다.
meshes_to_skip = set([])         # 이 세트를 사용하여 필요치 않은 메시를 임시 저장합니다.

# 이름이 위에 설정한 문자열에 일치하지 않는 메시 액터를 씬에서 제거합니다.
for mesh_actor in ds_scene_in_memory.get_all_mesh_actors():
    actor_label = mesh_actor.get_label()
    if remove_keyword in actor_label:
        print("removing actor named: " + actor_label)
        # 이 액터의 메시 애셋을 생략할 메시 목록에 추가합니다.
        mesh = mesh_actor.get_mesh_element()
        meshes_to_skip.add(mesh)
        ds_scene_in_memory.remove_mesh_actor(mesh_actor)

# 임포트할 필요가 없는 모든 메시를 제거합니다.
for mesh in meshes_to_skip:
    mesh_name = mesh.get_element_name()
    print("removing mesh named " + mesh_name)
    ds_scene_in_memory.remove_mesh(mesh)

# 임포트 옵션을 설정합니다.
import_options = ds_scene_in_memory.get_import_options()
tessellation_options = import_options.tessellation_options
tessellation_options.chord_tolerance = 15
tessellation_options.max_edge_length = 40
tessellation_options.normal_tolerance = 45

# 애셋과 액터를 생성하는 것으로 프로세스를 마무리합니다.
ds_scene_in_memory.import_scene()

# 데이터스미스 씬을 정리합니다.
ds_scene_in_memory.destroy_scene()
print "Custom import process complete!"

데이터스미스 씬에 대하여

임포트 전 단계 도중 데이터스미스로 어떤 작업을 할 수 있는지 살펴보려면, 씬 생성 방식에 대해 약간 알아두면 도움이 됩니다.

씬 콘텐츠

데이터스미스 씬은 대부분 여러가지 요소 유형의 컨테이너입니다. 이 요소 각각은 임포트 후 콘텐츠 브라우저에 생성할 애셋, 또는 별도의 3D 공간 트랜스폼 정보로 레벨에 스폰할 액터 를 나타냅니다.

주요 애셋 요소 유형은 다음과 같습니다.

  • 메시: 각 메시 요소는 3D 지오메트리 블록을 나타냅니다. 임포트를 완료하면, 각 메시 요소는 Geometry 폴더 아래 별도의 스태틱 메시 오브젝트가 됩니다. 각 메시 요소에는 머티리얼 슬롯이 다수 있으며, 각각 머티리얼 요소 이름으로 연관되어 있습니다.

  • 머티리얼: 각 머티리얼 요소는 지오메트리에 필요한 표면 별개 유형을 나타냅니다. 임포트를 완료하면, 각 머티리얼 요소는 Materials 폴더 아래 별도의 머티리얼 오브젝트가 됩니다.

  • 텍스처: 각 텍스처 요소는 최소 하나의 머티리얼이 사용하는 2D 이미지를 나타냅니다. 임포트를 완료하면, 각 텍스처 요소는 Textures 폴더 아래 별도의 텍스처 오브젝트가 됩니다.

주요 액터 요소 유형은 다음과 같습니다.

  • 메시 액터: 각 메시 액터 요소는 레벨의 메시 지오메트리 인스턴스를 나타냅니다. 임포트를 완료하면, 각 메시 액터 요소는 월드 아웃라이너에 Static Mesh Actor 로 나타납니다.

  • 라이트 액터: 각 라이트 액터 요소는 씬의 라이트 이미터를 나타냅니다. 임포트를 완료하면, 각 라이트 액터 요소는 레벨에 기본 언리얼 라이트 유형의 인스턴스가 됩니다. 즉 포인트 라이트나 스포트 라이트, 또는 에리어 라이트를 시뮬레이션하는 커스텀 데이터스미스 액터가 됩니다. 이 라이트의 프로퍼티 값 중 강도, 색, IES 프로파일 텍스처 파일 등 다수를 구하고 설정할 수 있습니다.

  • 카메라 액터: 각 카메라는 소스 씬에 설정한 시점을 나타냅니다. 임포트를 완료하면 각 카메라 액터 요소는 레벨에 CineCameraActor 가 됩니다. 카메라 액터의 기본 프로퍼티 중 종횡비와 같은 것을 구하고 설정할 수 있습니다.

메모리의 데이터스미스 씬에 저장된 데이터는 .udatasmith 파일을 열었을 때 보이는 것과 매우 비슷합니다. 3ds Max 또는 Sketchup 을 사용하는 경우, 익스포트한 .udatasmith 파일을 열어 보면 데이터스미스 씬 생성 방식을 파악할 수 있습니다.

데이터스미스 파일 XML 콘텐츠

데이터스미스 씬 작업

주로 데이터스미스 상호작용은 위에 설명한 요소 목록을 구할 때입니다. 그 방법은 위 예제처럼 Python 에서 DatasmithSceneElementBase 를 사용하거나, 블루프린트에서 Datasmith > Scene 노드를 사용하면 됩니다.

요소 목록을 구했으면, 그 목록을 반복 처리하여 특정 요소 값을 구할 수 있습니다. 그런 다음 그 요소에 대해 (DatasmithMeshActorElement 같은) Python API, 또는 블루프린트의 Datasmith > Element 노드를 사용하여 해당 요소 관련 정보를 구하고 설정하면 됩니다. 요소가 액터 유형인 경우, 그 자손 액터 요소도 구할 수 있어 씬 계층구조를 탐색해 내려갈 수 있습니다.

씬에서 기존 요소를 (위 예제처럼) 제거하거나 새 요소를 추가하려면, Python 은 DatasmithSceneElementBase, 블루프린트는 Datasmith > Scene 노드를 사용하면 됩니다. 예로 액터를 제거한 뒤 다른 부모 아래 다시 추가하는 식으로 액터 계층구조를 섞을 수 있습니다.