언리얼에서 작업을 할때 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()

     


     

    실행화면