icon안동민 개발노트

에셋 레퍼런싱의 기초


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

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

에셋 레퍼런싱의 중요성

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

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

  1. 하드 레퍼런스
  • 정의 : 에셋을 직접적으로 참조하며, 항상 메모리에 로드됨
  • 사용 상황 : 자주 사용되는 핵심 에셋 (예 : 플레이어 캐릭터 모델)
  • 장점 : 빠른 접근 속도
  • 단점 : 메모리 사용량 증가
  1. 소프트 레퍼런스
  • 정의 : 에셋을 간접적으로 참조하며, 필요 시에만 로드됨
  • 사용 상황 : 선택적으로 사용되는 에셋 (예 : 레벨 특정 오브젝트)
  • 장점 : 메모리 효율성
  • 단점 : 로드 시 약간의 지연 발생 가능
하드 레퍼런스와 소프트 레퍼런스 비교

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

  1. 에셋 피커 사용
  • 방법 : 변수 기본값 설정 시 에셋 피커를 통해 직접 선택
  • 예 : 스태틱 메시 컴포넌트의 메시 설정
[Add Static Mesh Component] --> [Set Mesh]
                                    ^
                        [Asset Picker] -|
  1. 직접 할당
  • 방법 : 에디터에서 변수에 직접 에셋 드래그 앤 드롭
  • 예 : 블루프린트의 public 변수에 텍스처 할당
  1. 동적 로딩
  • 방법 : '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
  1. 지연 로딩 활용
  • 팁 : 필요한 시점에 에셋을 로드하여 초기 로딩 시간 단축
Event BeginPlay
      |
[Load Essential Assets] --> [Start Game]
                        --> [Load Non-Essential Assets in Background]
  1. 에셋 스트리밍 사용
  • 팁 : 대용량 레벨의 경우 레벨 스트리밍을 통해 부분적 로딩
Function: LoadNewArea
[Stream In Sub-Level] --> [Activate Trigger Volume]
                        --> [Update Player Objective]
  1. 참조 정리
  • 팁 : 불필요한 참조는 즉시 제거하여 메모리 누수 방지
Function: UnloadUnusedAssets
[Get All Referenced Assets] --> [Check Usage]
                              --> [Unload Unused]
  1. 에셋 번들링
  • 팁 : 관련 에셋을 그룹화하여 로딩 최적화
[Create Asset Bundle] --> [Add Related Assets]
                        --> [Save Bundle]

효율적인 에셋 관리 방법

  1. 명명 규칙 준수
  • 예 : SM_ (Static Mesh), T_ (Texture), M_ (Material) 등의 접두어 사용
  1. 폴더 구조화
  • 팁 : 에셋 유형과 사용 목적에 따라 체계적으로 폴더 구성
  1. 버전 관리
  • 팁 : 에셋의 변경 이력을 추적하고 관리
  1. 에셋 의존성 확인
  • 도구 : 언리얼 에디터의 'Reference Viewer' 활용
  1. 미사용 에셋 정리
  • 팁 : 정기적으로 프로젝트의 미사용 에셋 검토 및 제거

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

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]

 이 예제에서는 캐릭터의 기본 메시는 하드 레퍼런스로, 변경 가능한 헤어스타일과 의상은 소프트 레퍼런스로 관리합니다. 이를 통해 기본 캐릭터는 빠르게 로드하면서도, 다양한 커스터마이제이션 옵션을 메모리 효율적으로 제공할 수 있습니다.

 효과적인 에셋 레퍼런싱은 게임의 성능과 개발 효율성을 크게 향상시킬 수 있습니다. 하드 레퍼런스와 소프트 레퍼런스를 적절히 사용하고, 동적 로딩을 활용하며, 에셋 관리에 주의를 기울이면 더욱 최적화된 게임을 개발할 수 있습니다. 항상 프로젝트의 규모와 요구사항을 고려하여 가장 적합한 레퍼런싱 전략을 선택하는 것이 중요합니다.