데이터리스 커스터마이징 가능 오브젝트는 입력 노드가 게임 내 변경 가능한 Parameter 노드인 일반 커스터마이징 가능 오브젝트(Customizable Object)입니다.
다음 노드를 교체하여 모든 커스터마이징 가능 오브젝트를 데이터리스 오브젝트로 변환할 수 있습니다.
| Constant 노드 | Parameter 노드 |
|---|---|
Texture 노드 | Texture Parameter 노드 |
Skeletal Mesh 노드 | Skeletal Mesh Parameter 노드 |
머티리얼 노드 | Material Parameter 노드 |
Table 노드 | T/SK/M 노드 |
모든 노드를 교체할 필요는 없습니다. Constant 노드와 Parameter 노드를 조합하여 사용할 수 있습니다. 즉, Parameter 노드인 입력에 대해서만 데이터리스 기능을 활용할 수 있습니다.
커스터마이징 가능 오브젝트에 대한 개선 사항
컴파일 시간 단축(Faster compilation time): Parameter 노드의 입력은 컴파일되지 않고 런타임 때 변환됩니다.
암호화(Encryption): 이제 암호화가 바로 작동합니다. 더 이상 입력이 컴파일되지 않으므로(일반 UObject) 이제 평소처럼 암호화할 수 있습니다.
일반 UE 워크플로(Regular UE workflow): 기존 Constant 노드에서는 메시와 파라미터가 특수한 쿠킹 프로세스를 통해 커스터마이징 가능 오브젝트에 임베드되고 원본 에셋은 에디터 전용이라는 점을 염두에 두어야 했습니다. 새로운 데이터리스 시스템은 머티리얼 같은 다른 UE 시스템과 똑같이 작동합니다.
패키지 크기 감소(Possibly smaller packages): 이전에는 입력이 뮤터블 외부에서 참조되는 경우, 컴파일된 뮤터블 리소스(Mutable Resource)로 한 번 그리고 UObject로 한 번, 이렇게 두 번 패키지에 포함되었습니다. 그래서 이 방식은 권장하지 않는 것입니다. 이제 파라미터 입력이 컴파일되지 않으므로 더 이상은 문제가 없습니다.
제한 사항
퍼포먼스 저하(Less performant): 런타임 변환 및 상수 생성과 같은 일부 최적화를 컴파일 시점에 적용할 수 없습니다.
사용 가능한 옵션 없음(No available options): 입력 파라미터에 사용 가능한 옵션의 목록이 없습니다. 즉, 게임플레이 프로그래머는 이제 파라미터로 전달할 수 있는 입력을 제한해야 합니다.
새 파라미터
일반 파라미터로 새로운 텍스처(Texture), 스켈레탈 메시(Skeletal Mesh), 머티리얼 파라미터(Material Parameters)는 커스터마이징 가능 오브젝트 인스턴스를 생성하고 다음 함수(블루프린트 또는 C++)를 호출하여 설정할 수 있습니다.
UFUNCTION(BlueprintCallable, Category = CustomizableObjectInstance)
void SetTextureParameterSelectedOption(
const FString& TextureParamName,
UTexture* TextureValue);
UFUNCTION(BlueprintCallable, Category = CustomizableObjectInstance)
void SetSkeletalMeshParameterSelectedOption(
const FString& SkeletalMeshParamName,
USkeletalMesh* SkeletalMeshValue);
UFUNCTION(BlueprintCallable, Category = CustomizableObjectInstance)
void SetMaterialParameterSelectedOption(
const FString& MaterialParamName,
UMaterialInterface* MaterialValue);
또한 각 Parameter 노드에서 디폴트 값(Default Value)을 지정할 수 있습니다. 이 디폴트 값은 선택 사항이며 지정하지 않으면 nullptr이 됩니다. 이러한 디폴트 값은 커스터마이징 가능 오브젝트에서 얻을 수 있습니다.
UFUNCTION(BlueprintCallable, Category = CustomizableObject)
UTexture* GetTextureParameterDefaultValue(
const FString& InParameterName) const;
UFUNCTION(BlueprintCallable, Category = CustomizableObject)
USkeletalMesh* GetSkeletalMeshParameterDefaultValue(
const FString& ParameterName) const;
UFUNCTION(BlueprintCallable, Category = CustomizableObject)
UMaterialInterface* GetMaterialParameterDefaultValue(
const FString& ParameterName) const;
디폴트 값이 설정되어 있으면 참조된 오브젝트가 쿠킹된다는 점에 유의하세요. 또한 이러한 오브젝트의 수명 주기는 강력한 레퍼런스이므로 커스터마이징 가능 오브젝트와 동일합니다.
모든 파라미터가 설정된 다음, 결과를 확인하려면 다음을 호출해야 합니다.
UFUNCTION(BlueprintCallable, Category = CustomizableObjectInstance)
void UpdateSkeletalMeshAsync(
bool bIgnoreCloseDist = false,
bool bForceHighPriority = false);
예시
일반 노드(Regular Node): 스켈레탈 메시 레퍼런스는 에디터 전용 레퍼런스가 있기 때문에 레퍼런스 뷰어(Reference Viewer)에 표시됩니다.
패키지로 만든 게임에서 이러한 레퍼런스는 UObject로 포함되지 않고 뮤터블 리소스로 포함됩니다.
데이터리스 노드(Dataless Node): Skeletal Mesh 노드만 데이터리스로 변환된 것을 확인할 수 있습니다.
머티리얼은 여전히 파라미터가 아닌 상수입니다.