WN_인생기록

[UE_5] 모듈 제작 -2 (에셋 복제) 본문

언리얼 개발/이것저것 테스트

[UE_5] 모듈 제작 -2 (에셋 복제)

WhNi 2024. 4. 20. 21:41

라이브러리 중에는 스크립팅 라이브러리가 존재한다. 

 

UEditorUtilityLibrary와 UEditorAssetLibrary가 있는데 

 

UEditorUtilityLibrary에는 UObject를 선택하는 것과 FAssetData를 선택하는 기능이 있고 (TArray의 포인터로 데이터 저장)

 

UEditorAssetLibrary의 경우는 에셋의 리스트를 가져오는 기능을 하는거 같다. 

 

Editor에 새로운 모듈 추가할때 자꾸 파일헤더를 못찾는데 왜그런지 모르겠다. 모듈에 추가하고 빌드했으면 헤더 찾아야 하는거 아닌가... Intermidiate 때문에 그냥 파일 다 지우고 다시 빌드하는게 맞는지... 싶은데..

 

맞다... 결국엔 파일 지우고 다시 빌드하는게 맞다 ㅋㅋ 

 

후... 

 

암튼 이제 파일을 복사하는 기능을 만들어 볼 예정이다. 

 

이걸 구현할려면 먼저 

 

Asset Name / Object Path / Package Path 에 대한 개념과 

 

현재 에셋 데이터를 가져오는 기능 (GetSelectgedAssetData()) 과

에셋을 복사하는 기능  DuplicateAsset() 을 알아야 한다. 

 

Asset Name 은 말 그대로 에셋의 실제 이름이다. 

Object Path 는 에셋의 이름 +  패키지 이름까지 포함하는 경로이다. 

Packaga Path 는 에셋이 저장된 폴더라고 생각하면 될거 같다. 

 

void UQuickAssetsAction::DuplicateAssets(int32 NumOfDuplicates)
{
	if (NumOfDuplicates <= 0)
	{
		Print(TEXT("Please enter a Valid number"), FColor::Red);
		return;
	}

	// 에셋 데이터라는 데이터 형으로 배열을 만들어서 선택된 에셋 데이터 저장
	TArray<FAssetData> SelectedAssetData = UEditorUtilityLibrary::GetSelectedAssetData();
	uint32 Counter = 0;

	if (!SelectedAssetData.IsEmpty())
	{
		// 배열 돌면서 
		for (const FAssetData& AssetData : SelectedAssetData)
		{
			// 배열의 숫자만큼
			for (int32 i = 0; i < NumOfDuplicates; i++)
			{
				// 에셋의 Object 경로를 String으로 변환하고, 새롭게 복사될 에셋의 이름도 AssetName을 String으로 변환해 저장해둔다. 
				// 또한 그 뒤에 "_" 를 통해 구분하고, 인덱스를 추가해준다. 물론 i는 0이니까 +1 해주고
				// 새로운 이름을 패키지 경로에다가 새롭게 정의한 이름으로 합쳐준다 FPath::Combine 기능으로
				const FString SourceAssetPath = AssetData.ObjectPath.ToString();
				const FString NewDuplicatedAssetName = AssetData.AssetName.ToString() + TEXT("_") + FString::FromInt(i + 1);
				const FString NewPathName = FPaths::Combine(AssetData.PackagePath.ToString(), NewDuplicatedAssetName);

				// 그래서 실제로 복사하는 기능은 UEditorAssetLibrary::DuplicateAsset이지만, 이름을 고쳐주는셈
				if (UEditorAssetLibrary::DuplicateAsset(SourceAssetPath, NewPathName))
				{
					UEditorAssetLibrary::SaveAsset(NewPathName, false);
					Counter++;
				}
			}
		}
	}

	if (Counter > 0)
	{
		Print(TEXT("Successfully duplicated" + FString::FromInt(Counter) + "files"), FColor::Green);
	}
}

 

이 기능을 적용하면, 특정 에셋을 원하는 갯수 만큼 복사할 수 있게된다.