UE4 33

[UE4][Editor]스트리밍 레벨 조작

글을 쓰는 목적 에디터 타임에서 스트리밍 레벨을 로드하는 방법을 기록한다. 작업 환경 UE4.26 스트리밍 레벨 조작 스트리밍 레벨 로드 1. WorldBrowser 모듈에서 LevelCollectionModel을 얻어 온다. 2. LevelCollectionModel의 GetAllLevels를 통해 FLevelModel 리스트 정보를 얻어 온다. 3. LevelCollectionModel의 LoadLevels를 통해 로드할 레벨 로드 FWorldBrowserModule& worldBrowserModule = FModuleManager::LoadModuleChecked("WorldBrowser"); UWorld* world = GEditor->GetEditorWorldContext().World(); T..

UE4 2023.02.28

[UE4][Editor]맵 이벤트

글을 쓰는 목적 에디터에서 사용하는 모든 맵에서 액터를 변경한뒤 저장해야 하는 경우가 있었다. 이 문제를 해결하면서 맵 이벤트를 기록하기 위해 글을 쓴다. 작업 환경 UE4.26 맵 이벤트 델기게이트 형식 델리게이트 이름 설명 DECLARE_MULTICAST_DELEGATE_OneParam(FOnMapChanged, uint32) FEditorDelegates::MapChange 맵이 변경되었을 때 호출 DECLARE_MULTICAST_DELEGATE_TwoParams(FOnMapOpened, const FString& /* Filename */, bool /*bAsTemplate*/) FEditorDelegates::OnMapOpened 맵이 열릴 때 호출되어 맵 이름 및 템플릿인지 여부 DECLARE..

UE4 2023.01.17

[UE4] OpenLevel

글을 쓰는 이유 OpenLevel 사용법을 기록하기 위해 글을 쓴다. 작업 환경 UE4.26 OpenLevel 사용법 UGamePlayStatics::OpenLevel 을 사용하면 레벨을 로드 할 수 있다. levelName에 Level을 쓸 수도 있지만 Level을 찾는 검색시간이 상당히 오래 걸리기 때문에 full path로 쓰는게 좋다. 또한 Option을 통해 게임 모드를 로드하는 레벨에 설정할 수 있다. FString option = TEXT("?game=/Game/Blueprint/GameMode/TestGameModeBP.TestGameModeBP_C"); FString levelName = L"/Game/Maps/TestLevel" UGameplayStatics::OpenLevel(inWo..

UE4 2022.08.22

[UE4][Editor] Asset 저장

글을 쓰는 목적 Asset을 저장해야하는 경우가 있었다. 에디터 툴 작업하면서 생각보다 많이 쓰는 기능이라 기억하기 위해 글을 쓴다. 작업 환경 UE4.26 Asset 저장 1. UEditorUtilityLibrary::GetSelectedAssets를 통해 선택한 에셋들을 가져온다. 2. 선택된 에셋들을 MakrPackageDirty를 통해 수정한 상태로 변경 3. FEditorFileUtils::PromptForCheckoutAndSave 를 통해 에셋 저장 TArray selectedAssetArray = UEditorUtilityLibrary::GetSelectedAssets(); TArray packagesToSave; for(UObject* asset : selectedAssetArray) {..

UE4 2022.07.25

[UE4][BUG] 액터를 스폰하자 마자 삭제되는 현상

글을 쓰는 목적 액터를 스폰하였는데 삭제되는 경우가 있었다. 특이한 상황이라 기억하기 위해 기록을 남긴다. 작업 환경 UE4.26 원인 액터를 스폰했는데 캐릭터를 스폰하지 못하는 현상이 있었다. 콜스택을 확인해 보니 Actor를 스폰시에는 PostActorConstruction을 호출해주는데 PostActorContrustion에서 스폰 가능한 위치 여부를 확인하여 액터를 스폰한다. 만약 스폰 불가능한 위치로 액터를 스폰을 한다면 곧바로 Destory를 호출하여 액터를 파괴한다. Cast(GWorld()->SpawnActor(ATestCharacter::StaticClass())); void AActor::PostActorConstruction() case ESpawnActorCollisionHandli..

버그 2022.05.16

UE4 코드에서 DataTable 사용

글을 적는 이유 툴 작업을 하다보니 DataTable 편집 작업해야하는 일이 있었다. DataTable을 수정, 저장, CSV로 Export하는 방법을 기억하기 위해 적는다. 작업 환경 UE4.26 UDataTable 활용법 비우기 UDataTable* dataTable; dataTable->EmptyTable(); 저장 AssetEditorToolKit.cpp FAssetEditorToolkit::SaveAsset_Execute() 추가 UDataTable* dataTable; FName rowName; FTableRowBase tableRow; dataTable->AddRow(rowName, tableRow); 삭제 UDataTable* dataTable; FName rowName; dataTable..

UE4 2022.04.18

UE4 코드에서 MessageDialog 사용

글을 쓰는 목적 툴 개발 작업을 하면 MessageDialog 자주 쓰는데 자주 쓰기에 기억하기 위해 적는다. 작업 환경 UE4.26 MessageDialog 사용 방법 MessageDialog uint32 Result = FMessageDialog::Open( EAppMsgType::YesNoCancel, FText::FromString( Error ) ); #endif//PLATFORM_REQUIRES_FILESERVER if (Result == EAppReturnType::No) { break; } else if (Result == EAppReturnType::Cancel) { // Cancel - return a failure, and quit return false; } 참고 https://do..

UE4 2022.04.18

UE4 아웃 라이너에서 Actor 선택하기 C++

글을 쓰는 목적 아웃 라이너에서 액터를 선택하는 방법을 기억하기 위해 글을 쓴다. 작업 환경 UE4.26 코드에서 아웃라이너 선택하기 에디터를 활용하다 보니 아웃라이너 선택 기능이 필요했다. 위젯 리플렉터로 아웃라이너 코드를 살피다보면 SSceneOutiner 코드에서 아웃라이너의 기능을 처리 함을 알 수 있다. 아래 코드 처럼 아웃라이너에서 액터를 선택하는 코드가 나와있다. if ( bChanged ) { const FScopedTransaction Transaction( NSLOCTEXT("UnrealEd", "ClickingOnActors", "Clicking on Actors"), !bAnyInPIE ); GEditor->GetSelectedActors()->Modify(); // Clear th..

UE4 2022.04.12

UE4 Customized Property Layout 갱신

글을 쓰는 목적 UDataTable 저장 후 Property Layout 갱신이 필요한 상황인데 저장 이벤트를 기억하기 위해 글을 씀 작업 환경 UE4.26 Customized Property Layout 갱신 방법 UDataTable을 저장하면 최종 OnObjectSaved 이벤트를 호출한다. FCoreUObjectDelegates::OnObjectSaved.Broadcast(this); OnObjectSaved 호출을 받아 갱신하면 되는데 여기서 중요한 것은 Custom Property Layout을 만들 때 CustomizeChildren을 호출 받을 때 PropertyUtilities 포인터를 저장한다. 그리고 OnObjectSaved가 호출될때 PropertyUtiltites의 ForeceRef..

UE4 2022.04.08