월드 파티션은 언리얼 엔진 5로 넘어오면서 대규모 월드를 관리하기 위해 언리얼 엔진 4에서 사용되었던 월드 컴포지션을 대체하는 시스템이다. 월드 컴포지션의 경우 레벨안에 서브레벨을 두어 관리하는 방식이였다면, 월드 파티션은 단일 퍼시스턴트 레벨에 월드를 저장하여 스트리밍 소스와 셀의 거리에 따라 로드, 언로드를 조절하는 시스템이다. 월드 파티션은 다음 4가지 큰 특징이 있다. 액터당 한개의 파일 (One File per Actor) 월드 파티션 - 데이터 레이어(Data Layers) 레벨 인스턴싱 (Level Instancing) 월드 파티션 - HLOD (Hierarchical Levels of Detail) 월드 파티션 활성화 월드 파티션을 활성화 하기 위해서는 3가지 방법이 있다. 게임 카테고리에..
개요 프로퍼티의 메타데이터 지정자 중에 GetOptions 항목에 대해 알아 보자. GetOptions: FName이나 FString 속성에 대해 에디터 환경에서 텍스트 상자대신 드롭다운을 생성하는 기능 드롭다운의 내용은 함수의 결과값으로 채워진다. 함수는 에디터에서 블루프린트를 열 때 한번 호출되고, 사용자가 드롭다운을 클릭할 때마다 호출 된다. 사용 방법 GetOptions 지정자 다음에 함수명을 지정한다. 함수는 FName 또는 Fstring의 배열값을 반환해야 한다. UPROPERTY(EditAnywhere, meta = (GetOptions="GetElementalOptions")) FString Elemental; UFUNCTION() TArray GetElementalOptions() { r..
시작하며 에디터 모드(PIE)에서는 정상적으로 동작되었지만 릴리즈 모드 에서는 아이콘이 적용되지 않는 이슈가 발생하였다. 따라서 해당 이슈 분석 결과를 기록하고자 한다. 에디터모드 vs 릴리즈모드에 따른 SoftObjectPtr의 IsValid 함수 사용 이슈 TSoftObjectPtr를 이용하여 애셋을 참조하는 경우 다음과 같이 조건 처리하였다. TSoftObjectPtr WeaponIcon = GetWeaponIcon(WeaponType); if( WeaponIcon.IsValid()) { FString IconPath = WeaponIcon.ToString(); //IconPath로 아이콘 리소스 교체 중략 } 위 코드 결과 TSoftObjectPtr의 IsValid 함수 사용 시 모드에 따라 결과..
기즈모란? 에디터에서 레벨에 배치된 액터를 선택하면 선택한 액터 중심에 기즈모(Gizmo)가 출력된다. 해당 기즈모를 통해 위치, 크기, 회전 등을 조절할 수 있다. 엔진 코드 문득 어떻게 기즈모의 코드가 궁금하여 검색을 해보았는데 Gizmo를 검색어로 아무리 찾아보아도 찾을 수 없었다. GizmoComponent가 있었으나 해당 코드는 아니였다. 결론부터 말하자면 레벨 에디터의 선택 오브젝트에 대한 기즈모 코드는 "UnrealWidget.h" 파일의 FWidget 클래스로 구현되어 있었다. 왜 클래스 명이 FWidget인지는 모르겠지만 한동안 찾아 헤매었는데 까먹지 않기 위해 기록해 놓자. 렌더 관련 레벨 에디터에서 기즈모가 렌더되는 코드부분이 궁금하여 찾아보았다. "UnrealWidgetRender...
시작하며 에디터에서 액터, 캐릭터 등을 설정할 때 입력한 데이터가 유효한지 확인이 필요할 때가 있다. 이럴 때 데이터 유효성 검사 기능을 통하여 확인 할 수 있다. 기능 활성화 데이터 유효성 검사 기능은 기본적으로 활성화 되어있으며 편집(Edit) > 플러그인(Plugins)를 선택하고 플러그인 메뉴에서 Data Validation 이 활성화 되어있는지 확인한다. 사용자 정의 데이터 유효성 검사 UObject에는 IsDataValid 가상함수가 정의되어있다. 해당 함수를 오버라이드 하여 원하는 데이터 유효성 조건을 처리할 수 있다. //.h #if WITH_EDITOR virtual EDataValidationResult IsDataValid(TArray& ValidationErrors) override..
시작하며 언리얼 엔진에서는 블루프린트에서도 integer 변수를 비트마스크로 선언하는 기능을 지원한다. 최적화를 위해 사용했던 바이너리 플래그를 블루프린트에서도 편하게 사용할 수 있다. Enum 정의 블루프린트 타입을 사용하기 위해 BlueprintType 지정자를 입력하고, 추가적으로 메타데이터 지정자에 Bitflags를 입력하여 비트플래그 Enum 이 되도록 한다. 블루프린트에서 Integer 타입을 비트마스크 열거형으로 사용하고자 한다면 UseEnumValuesAsMaskValuesInEditor를 true로 입력한다. 한가지 팁을 더 말하자면 에디터에서 열거자 표시시 첫값과 마지막 값은 표시가 되지 않기때문에 정의에서 첫값과 마지막값을 정의하여 모든 열거자가 노출될 수 있도록 한다. UENUM(B..
시작하며 화면에 가득찬 이미지를 설정하는데 게임 해상도에 따라 종횡비율이 변경되지 않기를 희망하고자 한다. 종횡비를 고정한 방법에 대해 기록하고자 한다. 예시 Overlay 슬롯에 가득찬 Image를 추가하였다. 게임 해상도에 따라 이미지가 늘어나는 것을 확인할 수 있다. 종횡비 고정 처리 Image를 Size Box으로 래핑 해주고, 그 Size Box를 Scale Box로 래핑 한다. Scale Box와 Size Box의 조합으로 원하는 비율을 고정 할 수 있다. Scale Box의 스트레칭 옵션으로 상하 혹은 좌우만 늘릴 것인지 상하좌우 모두 늘릴것인지 설정 할 수 있다. Size Box의 Width와 Height Override를 입력해서 원하는 사이즈를 가지도록 설정하고 Scale Box의 슬롯..
시작하며 게임을 개발하다보면 특정 방향을 기준으로 회전된 벡터값을 구하거나 두 개의 방향벡터 사이의 각을 구해야 할 경우가 있다. 예제 코드를 기록하여 기억해 두고자 한다. 예시 캐릭터가 바라보는 방향을 기준으로 Z축 기준 +-30 각도의 방향 벡터를 구해보자. 코드 //회전된 방향 계산 FVector Forward = GetActorForwardVector(); Forward.Normalize(); FVector LeftDirection = Forward.RotateAngleAxis(-30.0f, FVector::UpVector); FVector RightDirection = Forward.RotateAngleAxis(30.0f, FVector::UpVector); //두 벡터 사이의 각도 float ..
시작하며 언리얼 엔진에서 문자열을 다루어야할 경우가 종종 발생한다. 그 중 자주 쓰는 문자열 나누기와 공백(스페이스) 제거하는 방법을 기록하고자 한다. 문자열 나누기 파일의 경로에서 폴더명이나 파일명을 구하는 상황등에서 문자열을 특정 단어로 나누어야 할때가 있다. C++에서는 strtok 함수를 통해서 문자열을 나눴었는데, 언리얼 엔진에서는 ParseIntoArray 함수로 나눌수 있다. FString AssetPath = TEXT("Project/Content/Game//UI/HUD/HUD_Main.uasset"); TArray Paths; AssetPath.ParseIntoArray(Paths, TEXT("/")); for (FString& Element : Paths) { UE_LOG(LogClas..
개요 UE4(Unreal Engine)의 UPROPERTY에는 여러 메타데이터 지정자가 있다. 그 중 EditCondition(EditConditionHides) 지정자를 사용하여 UPROPERTY 값에 따라 에디터에서 속성을 선택적으로 활성화, 비활성화 및 숨기는 방법을 기록하고자 한다. 기본 사용 일반적으로 bool 타입을 지정하여 활성화, 비활성화 할 수 있다. UPROPERTY(EditAnywhere, Category = "Move") bool bCanMove = true; UPROPERTY(EditAnywhere, Category = "Move", meta = (EditCondition = "bCanMove")) int MoveSpeed = 100; 숨김 옵션 EditConditionHides ..
UE4 - Enum to String 로그 출력을 위해 Enum의 이름을 출력하고자 하는 경우가 있다. Enum을 다음과 같이 설정한다고 할때 UENUM(BlueprintType) enum class ECharState : uint8 { None = 0, Idle = 1, Run = 10, Jump = 100, }; 다음과 같이 FString 또는 FName으로 값을 얻어올 수 있다. void AStudyPlayerController::PrintEnumString() { static ECharState State = ECharState::Run; FName EnumToName = FName(TEXT("Invalid")); FString EnumToString = TEXT("Invalid"); const ..
월드 컴포지션 WorldComposition은 대규모 월드 관리를 위해 만들어진 툴이다. 퍼시스턴트 레벨을 이용하여 스트리밍 정보를 저장하지 않도록 하여 동시에 레벨 작업을 하고자 할 때 병목현상을 해결할 수 있다. 퍼시스턴트 레벨에는 스트리밍 정보를 폴더 검색을 통해 발견된 레벨을 스트리밍 레벨로 적용한다. 각 스트리밍 레벨에는 패키지 헤더 정보가 저장되어 있어, 월드 컴포지션은 레벨을 메모리에 로드하지 않고도 정보를 읽을 수 있다. 월드 컴포지션은 거리 기반 레벨 스트리밍에 사용되는 월드 원점 시프트 기능에 의존하는데 이를 통해서 거대한 월드를 만들 수 있다. 월드 컴포지션 활성화 월드 세팅에서 월드 컴포지션 활성화 옵션을 켜는것으로 활성화 시킬 수 있다. 레벨 계층구조 창 메뉴에서 레벨을 선택하면 ..