에셋 임포트 및 관리
외부 모델·텍스처·사운드·애니메이션을 적절한 옵션으로 임포트하고 이름·참조·마이그레이션까지 관리합니다.
언리얼 엔진 프로젝트는 3D 모델, 텍스처, 사운드, 애니메이션 같은 여러 에셋(asset)으로 이루어집니다. 에셋은 게임을 만드는 재료이므로, 어떻게 가져오고 어떻게 정리하느냐가 나중의 작업 속도와 오류의 양을 좌우합니다. 처음에 아무 폴더에나 아무 이름으로 가져온 에셋은 프로젝트가 커질수록 찾기 어려워지고, 지우거나 옮길 때 다른 곳을 깨뜨리기 쉽습니다.
이 글에서는 외부 도구에서 만든 파일을 프로젝트로 가져오는 임포트(import) 과정과, 가져온 뒤 폴더와 이름, 참조를 관리하는 방법을 살펴봅니다. 마지막으로 다른 프로젝트로 에셋을 복사하는 마이그레이션(migration)도 다룹니다.
임포트하면 무엇이 생기나
언리얼 엔진에도 모델링 도구가 있지만, 실제 제작에서는 Blender, 3ds Max, Maya, Substance Painter, Photoshop 같은 외부 도구로 만든 결과물을 가져와 쓰는 경우가 많습니다. 이렇게 외부 파일을 프로젝트로 가져오는 과정이 임포트입니다.
임포트하면 엔진이 쓰는 형식의 에셋 파일인 .uasset이 새로 생깁니다. 즉 엔진은 외부 파일을 그대로 쓰는 것이 아니라, 자기 형식으로 변환한 사본을 만들어 씁니다. 그래서 외부 원본 파일도 따로 보관해야 합니다. 원본을 고친 뒤 다시 가져오는 재임포트(reimport)는 에셋에 기록된 원본 경로와 임포트 옵션을 쓰므로, 원본이 사라지거나 옮겨지면 재임포트를 할 수 없습니다.
주로 쓰는 파일 형식
언리얼 엔진은 많은 파일 형식을 가져올 수 있습니다. 자주 쓰는 형식은 다음과 같습니다.
| 종류 | 형식 | 특징 |
|---|---|---|
| 3D 모델 | FBX(.fbx) | 3D 모델과 애니메이션, 스켈레톤, 재질 정보를 함께 담을 수 있어 널리 쓰입니다. 지원 범위는 엔진 버전과 임포터에 따라 확인합니다. |
| 3D 모델 | OBJ(.obj) | 단순한 3D 모델 정보를 담으며, 재질 정보는 별도의 MTL 파일로 나뉩니다. |
| 텍스처 | PNG(.png) | 알파 채널(투명도)을 지원해 UI 요소나 투명한 재질에 자주 씁니다. |
| 텍스처 | JPG(.jpg, .jpeg) | 압축률이 높아 용량이 작은 일반 이미지 형식입니다. |
| 텍스처 | TGA(.tga) | 알파 채널을 지원하며 게임 개발에서 많이 씁니다. |
| 텍스처 | EXR(.exr) | HDR(High Dynamic Range) 이미지를 저장할 수 있어, 조명 정보나 하늘 배경 이미지에 씁니다. |
| 사운드 | WAV(.wav) | 편집 원본으로 PCM WAV를 씁니다. |
| 사운드 | OGG(.ogg) | 가져올 수 있는 압축 오디오 형식 가운데 하나입니다. |
| 애니메이션 | FBX(.fbx) | 3D 모델과 함께 애니메이션 데이터를 담아 가져옵니다. |
사운드에서 하나 기억할 것은, 가져올 때의 원본 형식과 게임 실행 중에 쓰는 압축 방식이 별개라는 점입니다. OGG로 가져왔다고 게임에서도 OGG로 재생되는 것이 아니라, 엔진이 사운드 에셋의 압축과 스트리밍 설정에 따라 다시 처리합니다. 이 차이는 에셋 최적화 및 압축에서 다시 다룹니다.
에셋 가져오기
임포트는 주로 콘텐츠 브라우저에서 합니다. 콘텐츠 브라우저가 보이지 않으면 Window 메뉴의 Content Browser에서 Content Browser 1을 눌러 열거나, 콘텐츠 드로어를 엽니다.
먼저 에셋을 가져올 폴더를 정합니다. 콘텐츠 브라우저 왼쪽의 폴더 트리에서 원하는 폴더를 고르거나, 오른쪽 클릭 메뉴로 새 폴더를 만듭니다. 예를 들어 Content/MyAssets/Models나 Content/MyAssets/Textures처럼 종류별 폴더를 미리 만들어 두면 좋습니다. Content 폴더 바로 아래에 무작정 가져오면, 에셋이 늘어날수록 무엇이 어디 있는지 알기 어려워집니다.
가져오는 방법은 두 가지입니다. 가장 쉬운 방법은 Windows 탐색기나 macOS의 Finder에서 .fbx나 .png 같은 파일을 골라, 콘텐츠 브라우저의 원하는 폴더 안으로 끌어다 놓는 것입니다. 다른 방법은 콘텐츠 브라우저 위쪽의 Import 버튼을 누르고, 열리는 파일 선택 창에서 파일을 골라 열기(Open)를 누르는 것입니다.
임포트 옵션 확인하기
3D 모델을 가져오면 옵션 창이 나타납니다. 엔진 버전과 쓰는 임포터에 따라 FBX 임포트 옵션 창이나 인터체인지(Interchange) 임포트 옵션 창이 나오는데, 어느 쪽이든 모델의 크기와 회전, 법선(normal), 그리고 재질과 텍스처, 애니메이션을 어디까지 함께 가져올지를 정합니다.
가장 먼저 확인할 옵션은 메시의 종류입니다. 스켈레탈 메시(Skeletal Mesh)는 뼈대인 본(bone)과, 본의 움직임에 따라 표면이 함께 변형되도록 연결한 스키닝(skinning)을 가진 모델로, 걷는 캐릭터처럼 형태가 휘어야 하는 모델에 씁니다. 스태틱 메시(Static Mesh)는 뼈대로 변형하지 않는 메시로, 건물이나 소품에 씁니다. 이 밖에 Import Materials는 모델에 적용된 재질을 함께 가져올지를, Import Textures는 그 재질이 쓰는 텍스처를 함께 가져올지를 정합니다. 옵션을 정했다면 Import나 Import All 버튼을 누릅니다.
임포트가 끝나면 고른 폴더 안에 .uasset 에셋이 생기고 콘텐츠 브라우저에 나타납니다. 가져온 직후에는 작은 테스트 맵에 놓고 크기와 축 방향, 법선, 충돌을 확인합니다. 외부 도구와 엔진의 단위나 축이 다르면 모델이 지나치게 크거나 누워 있는 경우가 많기 때문입니다. 텍스처는 색을 담은 이미지인지, 노멀 맵이나 거칠기처럼 수치 데이터를 담은 이미지인지에 맞춰 sRGB와 압축 설정을 확인합니다.
에셋 정리하기
에셋을 가져오는 일보다, 가져온 뒤의 관리 규칙을 함께 정하는 일이 더 중요합니다. 프로젝트가 커질수록 잘 정리된 에셋은 작업 속도를 높이고, 오류를 줄이고, 다른 사람과 함께 작업하기 쉽게 만듭니다.
폴더로 나누기
콘텐츠 브라우저에서 에셋을 정리하는 가장 기본적인 방법은 폴더입니다. 오른쪽 클릭 메뉴의 New Folder로 폴더를 만들고, Models, Textures, Materials, Blueprints, Sounds, Characters, Environments처럼 의미가 분명한 이름을 붙입니다. 에셋은 끌어다 놓아 다른 폴더로 옮깁니다. 다음은 폴더 구조의 한 예입니다.
이 구조는 종류별 폴더와 용도별 폴더를 섞은 예입니다. 레벨은 Maps에, 캐릭터와 환경처럼 한 덩어리로 다루는 에셋은 용도별 폴더에, 여러 곳에서 함께 쓰는 재질과 텍스처는 종류별 폴더에 둡니다. 외부에서 받은 에셋은 출처별 폴더에 따로 모아 두면, 라이선스를 확인하거나 업데이트할 때 범위를 찾기 쉽습니다. 폴더 구조를 정하는 기준은 에셋 브라우저와 폴더 구조에서 자세히 다룹니다.
이름 규칙 정하기
에셋의 이름 앞에 종류를 나타내는 짧은 접두사를 붙이는 방식이 흔히 쓰입니다. 아래 접두사는 프로젝트 규칙의 예일 뿐 엔진이 요구하는 문법은 아니므로, 팀에서 하나의 규칙을 정해 함께 씁니다.
| 접두사 | 에셋 종류 | 예 |
|---|---|---|
SM_ | 스태틱 메시(Static Mesh) | SM_Chair, SM_Table |
SK_ | 스켈레탈 메시(Skeletal Mesh) | SK_PlayerCharacter, SK_Enemy |
T_ | 텍스처(Texture) | T_Wood_Diffuse, T_Metal_Normal |
M_ | 재질(Material) | M_Wood, M_Metal |
MI_ | 재질 인스턴스(Material Instance) | MI_Wood_Dark |
BP_ | 블루프린트 클래스(Blueprint Class) | BP_Door, BP_Lever |
Anim_ | 애니메이션 시퀀스(Animation Sequence) | Anim_Walk, Anim_Run |
SFX_ | 효과음(Sound Effect) | SFX_Footstep, SFX_Explosion |
L_ | 레벨(Level) | L_MainLevel, L_Tutorial |
이름은 내용을 분명히 설명하되 너무 길지 않게 짓고, 단어 사이는 SM_Old_Wooden_Crate처럼 밑줄(_)로 구분합니다. 접두사를 붙이면 콘텐츠 브라우저에서 이름만 보고도 종류를 알 수 있고, 같은 이름의 메시와 재질, 텍스처를 쉽게 구별할 수 있습니다.
지우기 전에 참조 확인하기
에셋을 지울 때는 조심해야 합니다. 다른 에셋이나 레벨이 그 에셋을 참조하고 있을 수 있기 때문입니다. 예를 들어 재질 하나를 지우면, 그 재질을 쓰던 메시들의 표면이 모두 깨집니다.
에셋은 콘텐츠 브라우저에서 선택하고 Delete 키를 눌러 지웁니다. 지우려는 에셋을 다른 곳에서 참조하고 있다면 삭제 확인 창에 그 사실이 표시되고, 참조를 다른 에셋으로 바꾸는 Replace References나 강제로 지우는 Force Delete 같은 선택지가 나타납니다. Force Delete는 참조하던 쪽을 깨뜨릴 수 있으므로 함부로 쓰지 않습니다.
그래서 지우기 전에 미리 참조 관계를 확인하는 편이 안전합니다. 에셋을 오른쪽 클릭하고 Reference Viewer를 열면, 그 에셋을 누가 쓰고 그 에셋이 무엇을 쓰는지가 그래프로 보입니다. 이때 레퍼런스 뷰어의 깊이와 필터 설정에 따라 일부 관계가 숨겨질 수 있고, 코드에 문자열 경로로 적어 둔 참조는 그래프에 나타나지 않을 수 있습니다. 이런 관계까지 확인하고 참조를 정리한 뒤에 지웁니다.
다른 프로젝트로 에셋 복사하기
마이그레이션은 고른 에셋이나 폴더를 다른 언리얼 엔진 프로젝트로 복사하는 기능입니다. 복사이므로 원래 프로젝트의 에셋은 그대로 남습니다.
에셋 하나를 복사하더라도 그 에셋이 쓰는 재질과 텍스처가 없으면 대상 프로젝트에서 깨지므로, 마이그레이션은 종속성(dependency)까지 함께 복사합니다. 콘텐츠 브라우저에서 복사할 에셋이나 폴더를 고르고, 오른쪽 클릭 메뉴의 Asset Actions에서 Migrate를 고릅니다. 그러면 복사할 에셋과 그 종속성 목록을 보여 주는 에셋 보고서(Asset Report) 창이 나타납니다. 필요한 항목을 체크 해제하면 대상 프로젝트에서 참조가 깨질 수 있으므로 목록을 검토하고 OK를 누릅니다. 마지막으로 대상 프로젝트의 Content 폴더를 골라 Select Folder를 누르면 복사가 끝납니다.
마이그레이션이 옮기는 것은 에셋뿐입니다. C++ 코드나 플러그인 설치, 프로젝트 설정까지 옮기는 기능은 아니므로, 에셋이 그런 것에 의존한다면 대상 프로젝트에서 따로 맞춰야 합니다. 복사한 뒤에는 대상 프로젝트에 같은 경로의 에셋이 있어 충돌하지 않았는지 확인하고, 재질과 충돌, 애니메이션이 제대로 동작하는지와 로그에 경고가 없는지 점검합니다.
원본, 에셋, 액터를 구분해 기록하기
의자 모델 하나를 가져온다고 해 봅시다. 이때 서로 다른 세 가지가 생깁니다. 외부 원본인 Chair.fbx, 임포트로 만들어진 메시 에셋, 그리고 레벨에 배치한 의자 액터입니다. 원본은 재임포트할 때 쓸 재료이고, 메시 에셋은 여러 의자가 함께 쓰는 형상이며, 레벨의 액터는 위치를 가진 배치 하나입니다. 이 셋을 구분해 기록해 두고, 임포트 직후 테스트 맵에 놓아 크기와 방향, 충돌을 확인한 다음 저장합니다. 그러면 나중에 문제가 생겼을 때 임포트 옵션이 잘못된 것인지, 배치가 잘못된 것인지를 쉽게 가를 수 있습니다.
메시의 종류에 대해서도 흔한 오해가 있습니다. 스태틱 메시라는 이유만으로 그 의자가 절대 움직일 수 없는 것은 아닙니다. 뼈대로 형상을 휘게 하는 일과 액터 전체를 옮기거나 돌리는 일은 서로 다르기 때문입니다. 액터를 움직일 수 있는지는 메시의 종류가 아니라 액터의 이동성(Mobility) 설정과 그 액터에 붙인 동작에 달려 있습니다. 그래서 형상을 휘게 할 필요 없이 문 전체를 회전시키고 싶다면, 메시를 스켈레탈 메시로 바꿀 것이 아니라 액터의 Mobility와 회전 동작부터 확인합니다.
정리
- 임포트하면 외부 파일을 변환한
.uasset에셋이 생기며, 재임포트는 에셋에 기록된 원본 경로와 옵션을 쓰므로 외부 원본도 보관합니다. - 가져올 때는 미리 만든 폴더에 끌어다 놓거나 Import 버튼을 쓰고, 3D 모델은 옵션 창에서 메시 종류와 재질, 텍스처를 함께 가져올지를 정합니다.
- 스켈레탈 메시는 본과 스키닝으로 형태가 휘는 모델, 스태틱 메시는 뼈대로 변형하지 않는 모델이며, 액터를 움직일 수 있는지는 메시 종류가 아니라 Mobility와 동작이 정합니다.
- 가져온 직후 테스트 맵에서 크기, 축 방향, 법선, 충돌을 확인하고, 텍스처는 용도에 맞게 sRGB와 압축을 확인합니다.
- 폴더와 이름 접두사로 정리하고, 지우기 전에 레퍼런스 뷰어로 참조를 확인하며, Force Delete는 참조를 깨뜨릴 수 있습니다.
- 마이그레이션은 에셋과 종속성을 다른 프로젝트로 복사하지만, C++ 코드와 플러그인, 프로젝트 설정은 옮기지 않습니다.
연습 문제
1. 지워진 원본과 재임포트
Chair.fbx를 가져와 SM_Chair를 만든 뒤 원본 파일을 지웠습니다. 몇 주 뒤 모델을 고쳐 다시 가져오려고 SM_Chair에서 재임포트를 눌렀더니 실패합니다. 왜 그럴까요? 앞으로는 무엇을 함께 관리해야 할까요?
해설 보기
재임포트는 SM_Chair에 기록된 원본 경로의 파일을 다시 읽어 에셋을 갱신하는 기능입니다. 원본 파일이 지워졌으므로 읽을 파일이 없어 실패합니다.
에셋은 원본을 변환한 사본일 뿐이므로, 외부 원본 파일을 정해진 위치에 보관하고, 재임포트에 쓸 원본 경로와 임포트 옵션도 함께 관리해야 합니다.
2. 재질을 지우려는데 경고가 떴다
M_OldWood 재질을 지우려 했더니 다른 곳에서 참조하고 있다는 경고와 함께 Force Delete가 나타났습니다. 바로 Force Delete를 눌러도 될까요? 안전하게 지우려면 어떻게 해야 할까요?
해설 보기
바로 누르면 안 됩니다. Force Delete는 참조하던 메시나 레벨의 연결을 깨뜨려, 그 재질을 쓰던 표면이 모두 깨진 상태가 될 수 있습니다.
먼저 레퍼런스 뷰어로 누가 이 재질을 쓰는지 확인합니다. 그 메시들의 재질을 다른 재질로 바꾸거나, 삭제 창의 Replace References로 참조를 새 재질로 옮긴 뒤 지웁니다. 코드에 문자열 경로로 적힌 참조는 그래프에 보이지 않을 수 있으므로 함께 확인합니다.
3. 마이그레이션한 블루프린트가 동작하지 않는다
C++ 클래스를 부모로 쓰는 BP_Door와, 특정 플러그인의 기능을 쓰는 재질을 다른 프로젝트로 마이그레이션했습니다. 대상 프로젝트에서 열어 보니 블루프린트와 재질이 제대로 동작하지 않습니다. 무엇이 빠졌을까요?
해설 보기
마이그레이션은 에셋과 그 에셋의 종속성만 복사하고, C++ 코드나 플러그인 설치, 프로젝트 설정은 옮기지 않습니다. 그래서 BP_Door의 부모 C++ 클래스와 재질이 쓰는 플러그인이 대상 프로젝트에 없습니다.
대상 프로젝트에 같은 C++ 클래스를 추가하고, 필요한 플러그인을 켜고, 관련 프로젝트 설정을 맞춘 뒤 다시 확인해야 합니다.
임포트 옵션과 지원 형식은 Epic의 에셋 임포트 안내에서 확인할 수 있습니다.
다음 글 에셋 브라우저와 폴더 구조에서는 콘텐츠 브라우저에서 에셋을 찾고 정리하는 방법과, 에셋을 옮기거나 이름을 바꿀 때 참조가 어떻게 갱신되는지 살펴봅니다.