2년동안 MMORPG 출시를 위해 한다고는 했지만 시간과 여건이 허락하지 않아서 완성도 있게 하지 못한것이 일단 아쉬워서... 출시 이후에라도 이곳 저곳 견고하게 다져놔야 라이브 때 실수 없이 서비스를 이어갈 수 있을것이다. 주변에 게임 개발에 CI/CD 와 이런 데이터 검증 자동화 시스템이 얼마나 중요한지 이해하는 분들을 찾아보기란 참 어렵다. 특히 한국에서는 일단 현재까지 그랬고... 이 부분에 별도로 투자를 안하는 걸 보면 아마 게임개발 예산 항목에서 이 부분이 아예 검토 대상이 아니라고 프로듀서들이 생각해서인것 같다.
크래프톤의 퍼블리싱 플레폼 헤드분이 에픽 본사에서 오신 분이라 아마도 크래프톤은 아마도? 앞으로는 달라지지 않을까... 정도의 생각이랑 엔씨소프트가 욕은 많이 먹지만 그래도 좀 신경을 쓰지 않을까? 라는 정도...
사업부 정도만 CPI 에 관심이 있어서 차트로 리포팅을 하는데 개발 과정도 일간 주간 월간 차트가 리포팅 되거나 엄격하게 개발팀 내에서 셰어 되야 하는데... 이런 문화도 한국은 일단 내가 겪은 회사에서는 없었다.
Unreal Engine 에서 제공하는 Data Validation 플러그인은 대규모 프로젝트에서 필수적인 품질 관리 도구다. 에셋 네이밍 규칙부터 필수 속성 체크, 의존성 검사까지 자동화할 수 있어, 스튜디오 규모가 커질수록 활용도가 높아진다. 이번 글에서는 Data Validation의 핵심 개념, C++ 및 Python 확장 방법, 실무 적용 사례까지 하나씩 파헤친다.
1. Data Validation 플러그인 개요
Data Validation 플러그인은 에셋(Asset) 품질 관리, 네이밍 컨벤션, 필수 속성 체크, 의존성 검사 등 다양한 검증 규칙을 개발자가 직접 정의하여, 에디터 저장 시점, 수동 실행, 또는 커맨드라인/CI 환경에서 자동 실행할 수 있도록 지원합니다.
게임 프로젝트가 커질수록 에셋 관리 난이도는 기하급수적으로 증가한다.
Data Validation은 다음 문제를 자동으로 해결한다:
- 잘못된 네이밍 규칙으로 인한 런타임 에러
- LOD, 머티리얼, 사운드 설정 누락
- 멀티팀 협업에서 발생하는 에셋 의존성 충돌
- CI/CD 환경에서 빌드 전 검증 자동화
즉, "사전에 오류를 차단"하는 프로덕션 파이프라인 구축이 가능하다
2. Data Validation API 구조 및 주요 클래스
2.1 핵심 클래스 요약
- UEditorValidatorBase (C++/Blueprint 기반)
- 커스텀 검증 로직을 작성할 때 상속받는 기본 클래스입니다.
- 주요 메서드: CanValidateAsset, ValidateLoadedAsset, GetValidationResult 등.
- UEditorValidatorSubsystem
- 등록된 모든 Validator를 관리하고, 에셋 검증을 실행하는 서브시스템입니다.
- Python, C++ 모두에서 접근 가능하며, 에디터 내 자동화/수동 검증을 지원합니다.
- UDataValidationSettings
- 프로젝트별 Validation 세팅, 규칙 활성화/비활성화, 결과 필터링 등의 옵션을 제공합니다.
3. C++ 기반 확장 방법
3.1 확장 절차 개요
- 새로운 Validator 클래스 생성
- UEditorValidatorBase를 상속받아 커스텀 클래스를 생성합니다.
- 핵심 메서드 오버라이드
- CanValidateAsset(UObject* InAsset): 해당 Validator가 어떤 에셋에 적용될지 판별.
- ValidateLoadedAsset(UObject* InAsset, FDataValidationContext& Context): 실제 검증 로직 구현.
- (필요 시) GetValidationResult() 등 추가 오버라이드 가능.
- 플러그인 또는 프로젝트에 등록
- Validator를 플러그인 모듈이나 프로젝트 모듈에 등록하여 에디터에서 인식하도록 설정.
- 사용
- 에디터 내 수동 실행, 저장 시 자동 실행, 커맨드라인(Commandlet) 기반 자동화 가능[[1]].
3.2 예시 코드
#include "EditorValidatorBase.h"
#include "MyCustomValidator.generated.h"
UCLASS()
class UMyCustomValidator : public UEditorValidatorBase
{
GENERATED_BODY()
public:
virtual bool CanValidateAsset_Implementation(UObject* InAsset) const override
{
// 예: 특정 타입만 검증
return InAsset->IsA<USoundWave>();
}
virtual EDataValidationResult ValidateLoadedAsset_Implementation(UObject* InAsset, TArray<FText>& ValidationErrors) override
{
// 예: SoundWave의 Attenuation 설정 여부 체크
USoundWave* Sound = Cast<USoundWave>(InAsset);
if (Sound && !Sound->AttenuationSettings)
{
ValidationErrors.Add(NSLOCTEXT("MyCustomValidator", "MissingAttenuation", "SoundWave asset is missing AttenuationSettings."));
return EDataValidationResult::Invalid;
}
return EDataValidationResult::Valid;
}
};
위 예시처럼, CanValidateAsset_Implementation과 ValidateLoadedAsset_Implementation을 오버라이드하여 원하는 검증 로직을 자유롭게 구현할 수 있습니다[[2]].
4. Python 기반 확장 및 자동화
4.1 Python API 개요
Unreal Engine은 Editor Scripting Utilities와 Python API를 통해 에디터 자동화 및 Data Validation 확장을 지원합니다. 주요 진입점은 unreal.EditorValidatorSubsystem입니다.
4.2 주요 메서드
- validate_assets(asset_paths_or_objects, only_enabled=True, fix=False)
- 여러 에셋을 일괄 검증.
- validate_asset_data(asset_data, only_enabled=True, fix=False)
- 단일 에셋 데이터 검증.
- run_validator(validator, asset)
- 특정 Validator를 직접 호출.
4.3 Python 예제
import unreal
validator_subsystem = unreal.EditorValidatorSubsystem()
assets = ['/Game/MyAssets/MySound1', '/Game/MyAssets/MySound2']
results = validator_subsystem.validate_assets(assets, only_enabled=True)
for result in results:
print(f"Asset: {result.asset_name}, Result: {result.result}, Errors: {result.errors}")
5. 실제 활용 사례 및 해외 스튜디오 적용 예시
5.1 글로벌 활용 사례
- Netflix Virtual Production
- Netflix와 Epic Games가 협업한 Virtual Production Validation Framework는 UE Data Validation 시스템을 확장해, 실시간 콘텐츠 제작 파이프라인의 품질을 자동으로 검증합니다. ICVFX(인카메라 VFX) 워크플로우에서 에셋 설정, 씬 구성, 성능 제한, 의존성 체크 등을 자동화하여, 현장 작업 중 실수로 인한 이슈를 사전에 차단합니다.
- 해당 프레임워크는 커스텀 Validator 추가, CI/CD 파이프라인 연동, 자동 Fix 기능까지 포함하여, 대규모 스튜디오의 실전 워크플로우에 적용되고 있습니다[[4]].
- AAA 게임 스튜디오
- 대형 게임 스튜디오(예: Ubisoft, EA, Rockstar 등)는 에셋 네이밍, 사운드 설정, LOD, 머티리얼 세팅 등 다양한 규칙을 Data Validation 플러그인으로 자동화하고 있습니다.
- 실제로 사운드 에셋의 Attenuation 누락, 머티리얼 속성 미설정 등 반복적인 실수를 자동 검증하여, QA 및 빌드 파이프라인에서 에러를 사전에 차단하는 데 활용됩니다[[5]].
6. 소스코드 분석 및 플러그인 구조
6.1 소스코드 위치 및 구조
- 공식 소스코드 위치
- EpicGames/UnrealEngine 공식 GitHub(https://github.com/EpicGames/UnrealEngine)에서 전체 엔진 및 Data Validation 플러그인 소스코드 접근 가능[[6]].
- Data Validation 플러그인 관련 주요 파일:
- Engine/Plugins/Editor/DataValidation/Source/DataValidation/Private/
- Engine/Plugins/Editor/DataValidation/Source/DataValidation/Public/
6.2 주요 C++ 파일
- EditorValidatorBase.h / .cpp
- 커스텀 Validator의 베이스 클래스, 핵심 오버라이드 메서드 정의.
- EditorValidatorSubsystem.h / .cpp
- Validator 등록/관리, 에셋 일괄 검증, 결과 리포트 등 서브시스템 구현.
- DataValidationSettings.h / .cpp
- 프로젝트별 Validation 설정, 규칙 활성화/비활성화, 결과 필터링 등 옵션 제공.
6.3 확장 및 통합 구조
- 플러그인 구조는 모듈러 방식으로 설계되어 있어, 신규 Validator 추가, 외부 툴 연동, Python/C++ 혼합 자동화 등이 용이합니다. 예를 들어:
- 모듈 확장 예시: FMyGameValidationModule::StartupModule() 내에서 자체 Validator를 등록할 수 있습니다.
TArray<UClass*> ValidatorClasses; GetDerivedClasses(UEditorValidatorBase::StaticClass(), ValidatorClasses); for (UClass* ValidatorClass : ValidatorClasses) { if (ValidatorClass->GetPackage() == GetTransientPackage()) { continue; } UEditorValidatorBase* Validator = NewObject<UEditorValidatorBase>(GetTransientPackage(), ValidatorClass); ValidatorSubsystem->RegisterValidator(Validator); }
- 외부 툴 통합 사례: Perforce와 워크플로우 통합이 가능합니다. 예를 들어, Perforce 체크인 전 Python을 사용하여 Validation을 자동으로 실행하는 사례:
import os
import sys
import subprocess
import unreal
# Perforce 연동 Python 스크립트 (p4 trigger 또는 pre-submit 스크립트)
def validate_ue_assets(changelist_number):
# Perforce에서 변경된 uasset 파일 목록 가져오기
p4_cmd = f"p4 fstat -e -T clientFile -Ol @={changelist_number}"
result = subprocess.check_output(p4_cmd, shell=True).decode('utf-8')
# uasset 파일만 필터링
assets = [line.split(' ')[1] for line in result.splitlines() if '.uasset' in line]
if not assets:
return True
# Unreal Editor 실행하여 검증
unreal_cmd = [
"path/to/UnrealEditor-Cmd.exe",
"/Path/To/Project/MyGame.uproject",
"-run=DataValidation",
f"-assets={','.join(assets)}",
"-ReportInvalid"
]
validation_result = subprocess.call(unreal_cmd)
return validation_result == 0
if __name__ == "__main__":
changelist = sys.argv[1]
is_valid = validate_ue_assets(changelist)
if not is_valid:
print("Data Validation 실패! 체크인 전 문제를 수정하세요.")
sys.exit(1)
sys.exit(0)
- 실제 소스코드에서는 각 Validator가 UObject 기반으로 구현되어 있어, 리플렉션 및 에디터 확장성이 매우 높습니다.
- UObject 기반 구현의 주요 이점:
- 언리얼 에디터의 프로퍼티 시스템(UPROPERTY) 활용 가능 - 에디터 UI에서 Validator 설정을 직접 편집 가능
- Blueprint 확장성 - C++로 작성된 Validator를 Blueprint에서 상속받아 비프로그래머도 확장 가능
- 런타임 타입 정보(RTTI) 제공 - IsA(), Cast<>() 등을 활용한 동적 타입 체크 및 변환
- 자동 직렬화/역직렬화 - 설정 값이 자동으로 저장되고 로드됨
- UObject 기반 구현의 주요 이점:
// 예: Blueprint에서 확장 가능한 Validator
UCLASS(Blueprintable, meta=(DisplayName="텍스처 해상도 검증기"))
class MYGAME_API UTextureResolutionValidator : public UEditorValidatorBase
{
GENERATED_BODY()
public:
// 에디터 UI에서 설정 가능한 프로퍼티
UPROPERTY(EditAnywhere, Category="검증 규칙", meta=(DisplayName="최대 허용 해상도"))
int32 MaxAllowedResolution = 4096;
UPROPERTY(EditAnywhere, Category="검증 규칙")
bool bRequirePowerOfTwo = true;
// Blueprint에서 오버라이드 가능
UFUNCTION(BlueprintNativeEvent)
bool CanValidateAsset(UObject* InAsset) const;
// Blueprint에서 오버라이드 가능
UFUNCTION(BlueprintNativeEvent)
EDataValidationResult ValidateLoadedAsset(UObject* InAsset, FDataValidationContext& Context);
};
7. 결론 및 참고 자료
Unreal Engine 5.5.4 이상의 Data Validation 플러그인은 에디터/파이프라인 자동화, 품질 관리, 대규모 협업 환경에서 필수적인 도구로 자리 잡고 있습니다. C++/Python 기반의 자유로운 확장, 글로벌 스튜디오의 실전 적용 사례, 그리고 오픈 소스 기반의 투명한 구조 덕분에, 다양한 프로젝트에서 손쉽게 적용 및 커스터마이징이 가능합니다.
참고 공식 문서 및 자료
- Epic Games 공식 Data Validation 문서
- Netflix Tech Blog: Virtual Production Validation Framework
- Unreal Engine 공식 GitHub 저장소
- Unreal Community Wiki: Data Validators
'UNREAL ENGINE' 카테고리의 다른 글
언리얼 엔진 5.4 - DirectX12 → DirectX11 자동 Fallback 기능 분석 (0) | 2025.09.15 |
---|---|
일부 휴대폰에서 VulkanRHI를 사용할 때 GPUSort 결과가 정확하지 않는 이슈. (0) | 2025.09.12 |
.Uasset 데이터 Validation 기능 몇 가지. (3) | 2025.07.09 |
어셋 레퍼런스 규칙 위반 검사기 플러그인. (1) | 2025.05.24 |
CommonViewUniformBuffer 에 대해서... (0) | 2025.03.23 |