티스토리 뷰
커스텀 에디터에서 머티리얼을 생성하는 기능을 추가하기로 한다.
목표하는 바는 텍스처를 선택하고 머티리얼을 생성하는 버튼을 누르면 해당 텍스처가 적용된 머티리얼을 알아서 제작해 주는 기능이다.
자산을 생성하기 위해서는 다음의 정보들이 필요하다.
- 자산의 이름. (머티리얼의 이름)
- 어떤 폴더에 넣을 것인지?
- 노드를 만들고 핀을 연결
에디터 유틸리티 위젯이 이를 해결하기 적합하다. 유틸리티 위젯은 단순화된 슬레이브 위젯이지만 언리얼 모션 그래픽 UMG를 기반으로 한다.
따라서 EditorUtilityWidget 을 상속받은 C++ 클래스를 생성하여 사용하기로 한다.
먼저 에디터 상에서 유틸리티 위젯을 제작해준다. 원하는 모양으로 위젯을 작성한 뒤 에디터 유틸리티 위젯을 실행한다.
머티리얼 제작 위젯과 에디터 유틸리티 위젯실행 방법.
실제로 머티리얼을 생성하는 방법은 다음과 같다.
- 머티리얼 이름 체크. 중복이름 검사.
- 선택된 데이터확보
- 데이터 처리
- 경로 파악 (저장 위치/폴더 검사) 및 검사
- 머티리얼 제작
- 노드 제작
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "CreateMaterialFromSelectedTextures")
bool bCustomMaterialName = true;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "CreateMaterialFromSelectedTextures", meta = (EditCondition = "bCustomMaterialName"))
FString MaterialName =TEXT("M_");
UPROPERTY 의 메타를 사용하여 에디터 상에 원하는 멤버변수들을 보여준다.
위처럼 메타를 meta = (EditCondition = "bCustomMaterialName") 로 둔다면 부울 값에 따라 변수 편집을 활성화/비활성화 할 수 있게 된다.
먼저 제작할 것은 텍스처를 선택했는지 확인하는 함수다.
머티리얼은 텍스처만 선택된 상태로 만들어야하기 때문.
// 텍스처를 필터링하는 함수.
bool UQuickMaterialCreationWidget::ProcessSelectedData(
const TArray<FAssetData>& SelectedDataToProcess,
TArray<UTexture2D*>& OutSelectedTexturesArray,
FString& OutSelectedTexturePackagePath)
{
if (SelectedDataToProcess.Num() == 0)
{
DebugHeader::ShowMsgDialog(EAppMsgType::Ok, TEXT("No Texture Selected!"));
return false;
}
bool bMaterialNameSet = false;
for (const auto& SelectedData : SelectedDataToProcess)
{
UObject* SelectedAsset = SelectedData.GetAsset();
if (!SelectedAsset)
continue;
UTexture2D* SelectedTexture = Cast<UTexture2D>(SelectedAsset);
if (!SelectedTexture)
{
DebugHeader::ShowMsgDialog(EAppMsgType::Ok, TEXT("Please Selected Only Textures!\n") +
SelectedAsset->GetName() + TEXT(" is Not Textures..."));
return false;
}
OutSelectedTexturesArray.Add(SelectedTexture);
if(OutSelectedTexturePackagePath.IsEmpty())
OutSelectedTexturePackagePath = SelectedData.PackagePath.ToString();
// 사용자가 텍스처 이름을 재질로 사용하기를 원함.
if (!bCustomMaterialName && !bMaterialNameSet)
{
bMaterialNameSet = true;
MaterialName = SelectedAsset->GetName();
MaterialName.RemoveFromStart(TEXT("T_"));
MaterialName.InsertAt(0, TEXT("M_"));
}
}
return true;
}
먼저 선택된 에셋들을 전부 담아서 UTexture2D 로 Cast 되는지 확인한다. 하나라도 실패하면 텍스처가 아니므로 실패했다고 판단하게 된다.
또한 함수 내
부에서 텍스처 이름을 제작할 머티리얼 이름으로 할 것인지에 대한 기능도 추가해준다.
그 다음으로는 머티리얼을 생성할 위치에 동일한 이름의 에셋이 존재하는지 확인한다.
FPaths::GetBaseFilename 함수를 사용하여 에셋들의 경로를 받아와서 새롭게 만들 머티리얼의 이름과 비교한다. 비교했을 때 동일한 이름이 나오면 실패처리로 간주한다.
bool UQuickMaterialCreationWidget::CheckIsNameUsed(
const FString& FolderPathToCheck, const FString& MaterialNameToCheck)
{
// 아래 함수 두 번째 인자는 재귀적으로 할 것이냐. 내부에 있는 폴더까지 검사할 것이냐 여부임.
TArray<FString> ExistingAssetsPaths = UEditorAssetLibrary::ListAssets(FolderPathToCheck, false);
for (const auto& ExistingAssetPath : ExistingAssetsPaths)
{
const FString ExistingAssetName = FPaths::GetBaseFilename(ExistingAssetPath);
if (ExistingAssetName.Equals(MaterialNameToCheck))
{
DebugHeader::ShowMsgDialog(EAppMsgType::Ok,
MaterialNameToCheck + TEXT(" is already used by asset."));
return true;
}
}
return false;
}
동일한 이름이 있다면 알림창을 띄워 알려주면 된다.
이제 실제로 머티리얼을 생성한다.
#include "Factories/MaterialFactoryNew.h"
라는 새로운 헤더파일을 참조한다. 에셋을 만들기 위해서 (지금은 머티리얼을 제작하므로 머티리얼 팩토리가 필요) 팩토리가 필요하게 된다!
먼저 코드를 보면 다음과 같다.
UMaterial* UQuickMaterialCreationWidget::CreateMaterialAssets(
const FString& NameOfTheMaterial, const FString& PathtoPutMaterial)
{
FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
UMaterialFactoryNew* MaterialFactory = NewObject<UMaterialFactoryNew>();
UObject* CreatedObject = AssetToolsModule.Get().CreateAsset(NameOfTheMaterial, PathtoPutMaterial,
UMaterial::StaticClass(), MaterialFactory);
return Cast<UMaterial>(CreatedObject);
}
FAssetToolsModule 을 받아오고 해당 모듈을 통해 에셋을 제작한다. 이 과정에서 위에서 말했던 머티리얼 팩토리가 필요하게 된다.
아직은 머티리얼 내부적으로 텍스처가 적용된 머티리얼은 아니지만 새롭게 코드를 통해 에셋을 제작해 보았다.
다음은 코드를 통해 머티리얼 내부에 텍스처 노드를 만들고 자동으로 연결된 머티리얼을 만들어 볼 것이다.
Git -> https://github.com/InKyung-U/CustomEditor
GitHub - InKyung-U/CustomEditor
Contribute to InKyung-U/CustomEditor development by creating an account on GitHub.
github.com
'Unreal > Custom Editor' 카테고리의 다른 글
[UE 5.1] Actor Duplicate - 1 (0) | 2023.10.27 |
---|---|
[UE 5.1] Custom Material Tool - 2 (1) | 2023.10.13 |
[UE 5.1] Custom Icon (0) | 2023.09.20 |
[UE 5.1] Custom Slate Widget 04 (0) | 2023.09.19 |
[UE 5.1] Custom Slate Widget 03 (0) | 2023.09.13 |
- Total
- Today
- Yesterday
- sort
- LV2
- 스택/큐
- BFS
- level3
- 완전탐색
- 고득점 Kit
- 채팅서버
- IMGUI
- 프로그래머스
- Ue
- 정렬
- C++
- 누적합
- 재귀
- 너비우선탐색
- 디자인 패턴
- 힙
- 고득점kit
- FPS
- 개인공부
- greedy
- 탐욕법
- 해시
- Heap
- DFS
- UE5
- LV3
- Unreal 5.1
- 데디케이티드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |