안동민 개발노트

본문 시작

에셋 레퍼런싱의 기초

하드 참조와 소프트 참조의 로딩 시점·메모리 영향을 비교하고 상황에 맞는 에셋 참조 방식을 선택합니다.

지금까지는 게임 데이터를 저장/관리하는 방법을 살펴봤습니다.

하지만 실제 프로젝트에서는 3D 모델, 텍스처, 사운드, 애니메이션, 블루프린트처럼 파일 형태의 리소스도 다뤄야 합니다.

이 리소스를 에셋(Asset)이라 부르며, 블루프린트나 C++ 코드에서 어떻게 참조하고 사용하는지 이해하는 것이 중요합니다.

이번 절에서는 에셋 레퍼런싱(Asset Referencing)의 기본 개념과 활용법을 정리합니다.


에셋 레퍼런싱이란 무엇인가?

에셋 레퍼런싱은 블루프린트나 코드에서 게임 프로젝트 내의 특정 에셋(예: Static Mesh, Texture, Sound Wave, Blueprint Class 등)을 가리키는 방식을 의미합니다.

마치 파일 시스템에서 파일의 경로를 지정하여 파일을 찾아가는 것과 유사합니다.

언리얼 엔진에서 에셋 레퍼런스는 크게 두 가지 주요 형태로 나뉩니다.

하드 레퍼런스 (Hard Reference)
  • 개념: 특정 에셋에 대한 직접적인 참조를 의미합니다. 저장된 하드 참조가 로딩 의존성을 만들면 소유 에셋을 로드할 때 참조 대상도 함께 로드됩니다. 변수 타입만 만들고 값을 지정하지 않은 경우와는 구분합니다.
  • 형식: Object Reference (예: Static Mesh Object Reference, Texture2D Object Reference, Blueprint Class Reference 등)
  • 예시: Set Static Mesh 노드의 New Mesh 핀에 직접 Static Mesh 에셋을 연결하는 경우.
  • 장점: 참조 대상이 로드된 뒤 바로 사용할 수 있어 연결이 단순합니다. 이후의 텍스처·메시 스트리밍이나 리소스 준비 비용까지 없다는 뜻은 아닙니다.
  • 단점: 불필요한 에셋까지 미리 메모리에 로드될 수 있어 메모리 사용량이 증가하고, 초기 로딩 시간이 길어질 수 있습니다. 특히 대규모 프로젝트에서는 심각한 메모리 문제가 발생할 수 있습니다.
소프트 레퍼런스 (Soft Reference)
  • 개념: 특정 에셋의 경로(Path)에 대한 참조를 의미합니다. 이 레퍼런스를 가진 블루프린트나 클래스가 메모리에 로드될 때, 참조하는 에셋은 자동으로 로드되지 않습니다. 필요할 때 로드 요청을 하거나 이미 다른 경로로 로드되어 있는 객체를 사용합니다. 소프트 참조 자체만으로 대상의 로딩을 강제하지는 않습니다.
  • 형식: Soft Object Reference (예: Static Mesh Soft Object Reference, Texture2D Soft Object Reference, Soft Class Reference 등)
  • 예시: 아이템의 아이콘 이미지를 Soft Texture2D Reference 변수에 저장하고, 아이템이 인벤토리 창에 표시될 때만 해당 이미지를 로드하여 사용하는 경우.
  • 장점: 메모리 사용량을 최적화하고 초기 로딩 시간을 줄일 수 있습니다. 필요한 에셋만 필요할 때 로드하므로 유연성이 높습니다.
  • 단점: 에셋을 사용하기 전에 명시적으로 로딩하는 과정이 필요하며, 이 로딩 과정에서 약간의 지연이 발생할 수 있습니다.

블루프린트에서 에셋 레퍼런싱 활용

하드 레퍼런스 사용법

하드 레퍼런스는 변수 타입 설정 시 Object Reference를 선택하여 사용합니다.

변수 생성
  • 블루프린트 에디터를 엽니다.
  • 변수 패널에서 새 변수를 추가합니다.
  • 변수 유형을 Static Mesh Object Reference로 설정하고 이름을 MyMesh라고 지정합니다.
  • 디테일 패널에서 MyMesh 변수 옆의 드롭다운을 클릭하여 사용하고 싶은 Static Mesh 에셋(예: Shape_Cube)을 직접 지정합니다.
활용
  • Event BeginPlay나 다른 이벤트에서 Static Mesh Component의 Set Static Mesh 노드를 사용하고, New Mesh 핀에 MyMesh 변수(Get 노드)를 연결합니다.
  • 컴파일하고 플레이하면, 액터에 지정된 큐브 메시가 적용된 것을 볼 수 있습니다.

소프트 레퍼런스 사용법 (비동기 로딩)

소프트 레퍼런스는 변수 타입 설정 시 Soft Object Reference를 선택하여 사용하며, 이 예제에서는 사용할 때 Async Load Asset을 호출합니다.

변수 생성
  • 블루프린트 에디터를 엽니다.
  • 변수 패널에서 새 변수를 추가합니다.
  • 변수 유형을 Soft Static Mesh Object Reference로 설정하고 이름을 MySoftMesh라고 지정합니다.
  • 디테일 패널에서 MySoftMesh 변수 옆의 드롭다운을 클릭하여 사용하고 싶은 Static Mesh 에셋(예: Shape_Cylinder)을 직접 지정합니다. (하드 레퍼런스와 동일하게 에디터에서 연결합니다.)
활용 (비동기 로딩)
  • Event BeginPlay에서 MySoftMesh 변수(Get 노드)를 가져옵니다.
  • MySoftMesh를 Async Load Asset의 Asset에 연결하고, BeginPlay의 실행 선을 이 노드에 연결합니다.
    • Async Load Asset은 완료 시 Completed를 실행합니다. Out 실행 출력과 완료 시점을 혼동하지 않습니다.
  • Completed에서 반환된 Object를 Static Mesh로 캐스트하고, 성공한 경우에만 유효한 메시 컴포넌트의 Set Static Mesh로 연결합니다.
  • 캐스트 성공 결과를 New Mesh에 연결합니다. 로드 또는 캐스트에 실패하면 기존 메시를 유지하거나 실패 안내를 처리합니다.
  • 참고: Load Asset Blocking은 동기 로드입니다. 즉시 사용할 수 있을 때까지 기다리므로 게임 스레드의 지연을 유발할 수 있습니다. 비동기 완료 뒤 사용할 객체는 필요한 동안 하드 참조나 컴포넌트 속성에 보관합니다.

소프트 레퍼런스는 변수에 경로가 들어 있는 상태와 실제 에셋이 메모리에 준비된 상태를 분리해서 생각해야 합니다.


에셋 레퍼런싱의 중요성 및 선택 기준

  • 메모리 최적화: 소프트 레퍼런스는 게임의 메모리 사용량을 크게 줄일 수 있는 핵심적인 방법입니다. 특히 거대한 오픈월드 게임이나 에셋이 많은 게임에서 특정 구역에 진입했을 때만 해당 구역의 에셋을 로드하는 등, 효율적인 메모리 관리가 필수적입니다.
  • 초기 로딩 시간: 게임 시작 시 모든 에셋을 한꺼번에 로드하는 대신, 필요한 에셋만 점진적으로 로드함으로써 초기 로딩 시간을 단축하여 플레이어 경험을 향상시킬 수 있습니다.
언제 어떤 레퍼런싱을 사용해야 할까요?
  • 하드 레퍼런스
    • 게임 실행 내내 항상 필요한 필수 에셋 (예: 플레이어 캐릭터의 기본 모델, UI 기본 요소).
    • 작은 규모의 게임이나 특정 액터가 항상 동일한 소수의 에셋만 사용하는 경우.
    • 즉각적인 에셋 접근이 필요한 경우 (로딩 지연이 허용되지 않을 때).
  • 소프트 레퍼런스
    • 레벨 로딩 시점에 필요하지 않지만, 게임 플레이 도중 동적으로 로드되어야 할 에셋 (예: 특정 상호작용 시 나타나는 아이템 모델, 특정 효과음, 스킬 이펙트).
    • 플레이어의 선택에 따라 달라지는 에셋 (예: 캐릭터 커스터마이징 의상).
    • 큰 규모의 에셋이 많아 메모리 관리가 중요한 경우.

에셋 레퍼런싱은 단순히 변수 타입 선택을 넘어, 게임의 성능과 사용자 경험에 직접적인 영향을 미치는 중요한 최적화 개념입니다.

어떤 에셋을 언제 메모리에 로드할지 신중하게 계획하는 것이 효율적인 게임 개발의 핵심입니다.


이번 절에서는 에셋 레퍼런싱의 기본 개념, 즉 하드 레퍼런스와 소프트 레퍼런스의 차이점과 블루프린트에서의 활용법에 대해 알아보았습니다.

이 개념을 통해 게임의 메모리 사용량과 로딩 시간을 최적화할 수 있습니다.