1. 기본형 캐릭터 / 공용 에셋
- C++에서 하드 레퍼런스로 지정 (
ConstructorHelpers::FObjectFinder)
- 이유:
- 프로젝트 어디서 쓰더라도 동일한 기본 메시 보장
- 파생 BP에서 건드리지 않아도 됨
- Null 안전
- 단점:
- 빌드 타임에 에셋 경로가 하드코딩됨 → 변경 시 코드 수정/리빌드 필요
static ConstructorHelpers::FObjectFinder<USkeletalMesh> TempMesh(TEXT("SkeletalMesh'/Game/Characters/SK_Default.SK_Default'"));
if (TempMesh.Succeeded())
{
GetMesh()->SetSkeletalMesh(TempMesh.Object);
}
2. 스킨/변형이 많은 캐릭터
- C++에서 UPROPERTY(EditDefaultsOnly)로 필드 노출 + BP에서 설정
- 이유:
- 아티스트나 디자이너가 블루프린트에서 바로 교체 가능
- 다양한 외형 변형(스킨, 무기, 코스튬)에 유리
- 단점:
cpp
복사편집
UPROPERTY(EditDefaultsOnly, Category="Mesh")
USkeletalMesh* DefaultMesh;
AMyCharacter::AMyCharacter()
{
if (DefaultMesh)
GetMesh()->SetSkeletalMesh(DefaultMesh);
}
3. 런타임 동적 로드 (최적화)
- TSoftObjectPtr + 비동기 로드
- 이유:
- 초반 로딩 시간/메모리 절약
- 필요한 시점에만 에셋 로드
- 주로 오픈월드, 대규모 스킨 로테이션, DLC 컨텐츠에 사용
cpp
복사편집
UPROPERTY(EditDefaultsOnly, Category="Mesh")
TSoftObjectPtr<USkeletalMesh> DefaultMeshRef;
void AMyCharacter::BeginPlay()
{
if (DefaultMeshRef.IsValid())
{
GetMesh()->SetSkeletalMesh(DefaultMeshRef.Get());
}
else
{
DefaultMeshRef.LoadSynchronous();
GetMesh()->SetSkeletalMesh(DefaultMeshRef.Get());
}
}
🔹 정리
- 고정 기본형 →
FObjectFinder
- 변형/스킨 위주 → BP에서 세팅 (
UPROPERTY)