icon안동민 개발노트

에셋 레퍼런싱의 기초


 언리얼 엔진에서 에셋 레퍼런싱은 게임 개발의 핵심 요소 중 하나입니다.

 올바른 에셋 레퍼런싱은 게임의 성능, 메모리 관리, 그리고 전반적인 개발 효율성에 큰 영향을 미칩니다.

에셋 레퍼런싱의 중요성

  1. 성능 최적화 : 필요한 에셋만 로드하여 메모리 사용 최소화
  2. 모듈성 : 에셋 간의 관계를 명확히 하여 유지보수성 향상
  3. 동적 컨텐츠 : 런타임 중 에셋 로드/언로드를 통한 유연한 게임플레이 구현

소프트 레퍼런스 vs 하드 레퍼런스

 1. 하드 레퍼런스

  • 정의 : 에셋을 직접적으로 참조하며, 항상 메모리에 로드됨
  • 사용 상황 : 자주 사용되는 핵심 에셋 (예 : 플레이어 캐릭터 모델)
  • 장점 : 빠른 접근 속도
  • 단점 : 메모리 사용량 증가

 2. 소프트 레퍼런스

  • 정의 : 에셋을 간접적으로 참조하며, 필요 시에만 로드됨
  • 사용 상황 : 선택적으로 사용되는 에셋 (예 : 레벨 특정 오브젝트)
  • 장점 : 메모리 효율성
  • 단점 : 로드 시 약간의 지연 발생 가능

블루프린트에서 에셋 레퍼런싱 방법

 1. 에셋 피커 사용

  • 방법 : 변수 기본값 설정 시 에셋 피커를 통해 직접 선택
  • 예 : 스태틱 메시 컴포넌트의 메시 설정
[Add Static Mesh Component] --> [Set Mesh]
                                    ^
                        [Asset Picker] -|

 2. 직접 할당

  • 방법 : 에디터에서 변수에 직접 에셋 드래그 앤 드롭
  • 예 : 블루프린트의 public 변수에 텍스처 할당

 3. 동적 로딩

  • 방법 : 'Async Load Asset' 노드 사용
  • 예 : 게임 중 필요에 따라 사운드 파일 로드
Function: LoadBackgroundMusic
[Async Load Asset] --> [Create Audio Component]
                     --> [Set Sound]
                     --> [Play]

주의사항 및 팁

 1. 순환 참조 방지

  • 문제 : A 에셋이 B를 참조하고 B가 다시 A를 참조하는 상황
  • 해결 : 인터페이스 사용 또는 참조 구조 재설계
Instead of:
AssetA -> AssetB -> AssetA
 
Use:
AssetA -> InterfaceAB <- AssetB

 2. 지연 로딩 활용

  • 팁 : 필요한 시점에 에셋을 로드하여 초기 로딩 시간 단축
Event BeginPlay
      |
[Load Essential Assets] --> [Start Game]
                        --> [Load Non-Essential Assets in Background]

 3. 에셋 스트리밍 사용

  • 팁 : 대용량 레벨의 경우 레벨 스트리밍을 통해 부분적 로딩
Function: LoadNewArea
[Stream In Sub-Level] --> [Activate Trigger Volume]
                        --> [Update Player Objective]

 4. 참조 정리

  • 팁 : 불필요한 참조는 즉시 제거하여 메모리 누수 방지
Function: UnloadUnusedAssets
[Get All Referenced Assets] --> [Check Usage]
                              --> [Unload Unused]

 5. 에셋 번들링

  • 팁 : 관련 에셋을 그룹화하여 로딩 최적화
[Create Asset Bundle] --> [Add Related Assets]
                        --> [Save Bundle]

효율적인 에셋 관리 방법

 1. 명명 규칙 준수

  • 예 : SM_ (Static Mesh), T_ (Texture), M_ (Material) 등의 접두어 사용

 2. 폴더 구조화

  • 팁 : 에셋 유형과 사용 목적에 따라 체계적으로 폴더 구성

 3. 버전 관리

  • 팁 : 에셋의 변경 이력을 추적하고 관리

 4. 에셋 의존성 확인

  • 도구 : 언리얼 에디터의 'Reference Viewer' 활용

 5. 미사용 에셋 정리

  • 팁 : 정기적으로 프로젝트의 미사용 에셋 검토 및 제거

예제 : 캐릭터 커스터마이제이션 시스템

Blueprint: BP_CustomizableCharacter
Variables:
  - BodyMesh (Static Mesh - Hard Reference)
  - HairStyles (Array of Soft Object References)
  - Outfits (Array of Soft Object References)
 
Function: ChangeHairStyle
Input: StyleIndex (Integer)
[Load Asset from Soft Reference] --> [Set Skeletal Mesh Component]
                                 --> [Update Character Appearance]
 
Function: ChangeOutfit
Input: OutfitIndex (Integer)
[Load Asset from Soft Reference] --> [Apply Material to Body Mesh]
                                 --> [Update Character Appearance]

 이 예제에서는 캐릭터의 기본 메시는 하드 레퍼런스로, 변경 가능한 헤어스타일과 의상은 소프트 레퍼런스로 관리합니다.

 이를 통해 기본 캐릭터는 빠르게 로드하면서도, 다양한 커스터마이제이션 옵션을 메모리 효율적으로 제공할 수 있습니다.