언리얼에서 작업을 할때 Asset을 보기좋게 찾기 위해 접두어를 넣는 경우는 흔하다. Material의 경우 M_, Blueprint는 BP_와 같은식이다. 매번 이 과정을 하는것은 귀찮은 일이기 때문에 자동으로 접두어를 붙여주는 기능을 만들었다. 

 

목차

     

     


     

     

    1. Asset 접두어 넣기

     


     

    언리얼 공식문서에서 제시한 추천 접두어 모듬

     

    https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/AssetNaming/

     

    Recommended Asset Naming Conventions

    A recommended naming convention to help organize your Assets.

    docs.unrealengine.com

     


     

    .Build.cs 에 "UMG", "Niagara" 추가하기

     

    SWManager.Build.cs

    더보기
    using UnrealBuildTool;
    
    public class SWManager : ModuleRules
    {
    	public SWManager(ReadOnlyTargetRules Target) : base(Target)
    	{
    		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
    		
    		PrivateIncludePaths.AddRange(
    			new string[] {
                    System.IO.Path.GetFullPath(Target.RelativeEnginePath) + "/Source/Editor/Blutility/Private"
    			}
    			);
    		
    		PublicDependencyModuleNames.AddRange(
    			new string[]
    			{
    				"Core", "Blutility", "EditorScriptingUtilities", "UMG", "Niagara"
    				// ... add other public dependencies that you statically link with here ...
    			}
    			);
    			
    		PrivateDependencyModuleNames.AddRange(
    			new string[]
    			{
    				"CoreUObject",
    				"Engine",
    				"Slate",
    				"SlateCore",
    				// ... add private dependencies that you statically link with here ...	
    			}
    			);
    	}
    }

    PublicDependencyModuleNames.AddRange()

    • "UMG", "Niagara" 추가

     


     

    QuickAssetAction

     

    QuickAssetAction.h

    더보기
    #pragma once
    #include "CoreMinimal.h"
    #include "AssetActionUtility.h"
    
    #include "Materials/Material.h"
    #include "Materials/MaterialInstanceConstant.h"
    #include "Particles/ParticleSystem.h"	
    #include "Sound/SoundCue.h"
    #include "Sound/SoundWave.h"
    #include "Engine/Texture.h"
    #include "Blueprint/UserWidget.h"
    #include "Components/SkeletalMeshComponent.h"
    #include "NiagaraSystem.h"
    #include "NiagaraEmitter.h"
    
    #include "QuickAssetAction.generated.h"
    
    /** 우클릭 AssetAction에 새로운 기능 추가하기
     *  - Asset 복제
     *	- Asset 접두어 붙이기
     */
    UCLASS()
    class SWMANAGER_API UQuickAssetAction : public UAssetActionUtility
    {
    	GENERATED_BODY()
    
    public:
    	UFUNCTION(CallInEditor)
    	void DuplicateAssets(int32 NumOfDuplicates); // Asset 복제
    
    	UFUNCTION(CallInEditor)
    	void AddPrefixes(); // 접두어 달기
    
    private:
    	TMap<UClass*, FString>PrefixMap =
    	{
    		{UBlueprint::StaticClass(),TEXT("BP_")},
    		{UStaticMesh::StaticClass(),TEXT("SM_")},
    		{UMaterial::StaticClass(), TEXT("M_")},
    		{UMaterialInstanceConstant::StaticClass(),TEXT("MI_")},
    		{UMaterialFunctionInterface::StaticClass(), TEXT("MF_")},
    		{UParticleSystem::StaticClass(), TEXT("PS_")},
    		{USoundCue::StaticClass(), TEXT("SC_")},
    		{USoundWave::StaticClass(), TEXT("SW_")},
    		{UTexture::StaticClass(), TEXT("T_")},
    		{UTexture2D::StaticClass(), TEXT("T_")},
    		{UUserWidget::StaticClass(), TEXT("WBP_")},
    		{USkeletalMeshComponent::StaticClass(), TEXT("SK_")},
    		{UNiagaraSystem::StaticClass(), TEXT("NS_")},
    		{UNiagaraEmitter::StaticClass(), TEXT("NE_")}
    	};
    };

    헤더 추가

    • #include "Materials/Material.h"
    • #include "Materials/MaterialInstanceConstant.h"
    • #include "Particles/ParticleSystem.h"
    • #include "Sound/SoundCue.h"
    • #include "Sound/SoundWave.h"
    • #include "Engine/Texture.h"
    • #include "Blueprint/UserWidget.h"
    • #include "Components/SkeletalMeshComponent.h"
    • #include "NiagaraSystem.h"
    • #include "NiagaraEmitter.h"

    함수 추가

    • UFUNCTION(CallInEditor)
      void AddPrefixes(); // 접두어 달기

    접두어로 사용에 쓰일 TMap

    • TMap의 Key는 '각각의 Asset 타입', Value는 '각각의 Asset타입의 접두어 텍스트'
    • TMap<UClass*, FString>PrefixMap = {
      {UBlueprint::StaticClass(),TEXT("BP_")}, ... };

     

     

     

    QuickAssetAction.cpp

    더보기
    #include "AssetActions/QuickAssetAction.h"
    #include "DebugHeader.h"
    #include "EditorUtilityLibrary.h"
    #include "EditorAssetLibrary.h"
    
    void UQuickAssetAction::DuplicateAssets(int32 NumOfDuplicates) // Asset 복제하기
    {
    	if (NumOfDuplicates <= 0) // 복사 개수가 0이하라면
    	{
    		// DebugHeader.h에 만든 ShowMsgDialog함수를 콜해 아래의 문구를 띄운다.
    		ShowMsgDialog(EAppMsgType::Ok, TEXT("Please enter a VALID number"));
    		return;
    	}
    
    	TArray<FAssetData> SelectedAssetsData = UEditorUtilityLibrary::GetSelectedAssetData();
    	uint32 Counter = 0;
    
    	for (const FAssetData& SelectedAssetData : SelectedAssetsData)
    	{
    		for (int32 i = 0; i < NumOfDuplicates; i++)
    		{
    			// Asset 경로, 이름짓기, 복제될 Asset의 경로
    			const FString SourceAssetPath = SelectedAssetData.ObjectPath.ToString();
    			const FString NewDuplicatedAssetName = SelectedAssetData.AssetName.ToString() + TEXT("_") + FString::FromInt(i + 1);
    			const FString NewPathName = FPaths::Combine(SelectedAssetData.PackagePath.ToString(), NewDuplicatedAssetName);
    
    			// SourceAssetPath경로에 있는 Asset을 NewPathName경로로 복제
    			if (UEditorAssetLibrary::DuplicateAsset(SourceAssetPath, NewPathName)) 
    			{
    				UEditorAssetLibrary::SaveAsset(NewPathName, false); // NewPathName경로에 Asset을 저장
    				++Counter;
    			}
    		}
    	}
    
    	if (Counter > 0) // 복제가 0 초과면 문구 띄우기
    	{
    		// DebugHeader.h에 만든 ShowNotifyInfo함수를 콜해 언리얼에디터 우측 하단에 아래의 문구를 띄운다.
    		ShowNotifyInfo(TEXT("Successfully duplicated " + FString::FromInt(Counter) + " files"));
    	}
    }
    
    void UQuickAssetAction::AddPrefixes() // 접두어 달기
    {
    	TArray<UObject*>SelectedObjects = UEditorUtilityLibrary::GetSelectedAssets(); // 선택된 Asset들을 TArray변수에 다 담는다
    	uint32 Counter = 0;
    
    	for (UObject* SelectedObject : SelectedObjects)
    	{
    		if (false == IsValid(SelectedObject)) continue; // 선택된 Asset이 없으면 리턴
    
    		FString* PrefixFound = PrefixMap.Find(SelectedObject->GetClass()); // PrefixMap에서 알맞는 접두어를 찾아 변수에 담는다
    
    		if (nullptr == PrefixFound || PrefixFound->IsEmpty()) // PrefixFound가 없다면
    		{
    			Print(TEXT("Failed to find prefix for class ") + SelectedObject->GetClass()->GetName(), FColor::Red); 
    			continue;
    		}
    
    		FString OldName = SelectedObject->GetName();
    
    		if (OldName.StartsWith(*PrefixFound))
    		{
    			Print(OldName + TEXT(" already has prefix added"), FColor::Red);
    			continue;
    		}
    
    		const FString NewNameWithPrefix = *PrefixFound + OldName; // '접두어+기존이름' 변수에 담음
    
    		UEditorUtilityLibrary::RenameAsset(SelectedObject, NewNameWithPrefix); // 선택된 Asset을 새로운 이름으로 이름 변경
    
    		++Counter; // 추후에 문구를 띄울때 몇개의 Asset들이 이름변경 됬는지 알아야하므로 기록
    	}
    
    	if (Counter > 0)
    	{
    		ShowNotifyInfo(TEXT("Successfully renamed " + FString::FromInt(Counter) + " assets"));
    	}
    }

    함수 정의

    • void UQuickAssetAction::AddPrefixes()

     


     

    실행화면