티스토리 뷰

커스텀 에디터 첫 번째 포스팅.

에디터의 작업 유형은 2 가지이다. 에셋과 액터. 두 종류에 대한 작업으로 모두 이루어 져 있을 것이다.

AssetActionUtility 와 ActorActionUtility 의 파생클래스를 만들어서 사용하는 방식으로 커스텀 에디터를 사용할 수 있다.

 

먼저 UAssetActionUtility의 파생 클래스를 만든다.

그런데 AssetActionUtility.h 는 플러그인 파일에 존재하지 않기 때문에 보편적인 include로는 참조가 어렵다. 따라서 cs파일 내부에서 모듈을 추가해 주어야하고 경로또한 추가해주어야 한다.

PrivateIncludePaths.AddRange(
			new string[] {
            System.IO.Path.GetFullPath(Target.RelativeEnginePath) + 
			"/Source/Editor/Blutility/Private"
            }
			);

엔진의 경로를 받아온 뒤 Blutility 내부의 Private로 경로를 잡아준다.

 


UAssetActionUtility를 상속받는 C++ 클래스를 만들어 준다.

클래스 내부 public 함수에 UFUNCTION(CallInEditor) 매크로를 붙인다면 언리얼 에디터상에서 내가 지정한 함수를 호출할 수 있게된다.

public:
	UFUNCTION(CallInEditor)
	void TestFunc();

만든 함수 호출 가능!

함수의 파라미터를 달리하면 에디터 상에서 알아서 input 창을 띄워준다.

UFUNCTION(CallInEditor)
void TestInputValue_intstring(int32 num1, FString& string);

int32와 FString을 받는

함수를 호출 할 시 다음과 같은 창이 뜬다.


이 기능을 토대로 기본적인 복제 기능을 만든다.

UEditorUtilityLibrary 와 UEditorAssetLibrary  에는 복제 함수가 있다. 선택된 자산 데이터를 TArray<UObject*> 으로 가져올 수 있다. UEditorAssetLibrary는 엔진->플러그인 에 존재한다. 따라서 위에서 했던것과 같이 경로까지 추가할 필요는 없으며 모듈만 추가해주면 된다.

PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Core", "Blutility", "EditorScriptingUtilities"
			}
			);

 

 

UEditorAssetLibrary::DuplicateAsset 함수는 원본의 파일경로 와 복제품을 넣을 경로를 인자로 받는다.

복제를 원하는 만큼 input을 받고 for문을 돌며 이름, 경로를 설정해준다.

우선 코드는 다음과 같다.

for (const auto& SelectedAssetData : SelectedAssetsData)
	{
		for (int32 i = 0; i < NumOfDuplicates; i++)
		{
			// 원본의 경로
			//const FString SourceAssetPath = SelectedAssetData.ObjectPath.ToString();
			const FString SourceAssetPath = SelectedAssetData.GetSoftObjectPath().ToString();

			// 복제품의 "이름 + _복제Index" 를 만들어준다.
			const FString NewDuplicatedAssetName = SelectedAssetData.AssetName.ToString() 
				+ TEXT("_") + FString::FromInt(i+1);
			
			// 복제한 에셋을 저장할 경로. 선택한 에셋의 패키지 경로 에 새로 만들 복제품의 이름을 달아주어야 함.
			const FString NewPathName 
				= FPaths::Combine(SelectedAssetData.PackagePath.ToString(), NewDuplicatedAssetName);

			if (UEditorAssetLibrary::DuplicateAsset(SourceAssetPath, NewPathName))
			{
				UEditorAssetLibrary::SaveAsset(NewPathName, false);
				++Counter;
			}
		}
	}

자산, 이름, 개체, 경로 및 패키지 경로간의 차이점을 숙지해야 한다.

A라는 에셋은 A패키지위치->A파일 라는 위치에 저장되어 있을 것이다.

그렇다면 A를 복제한 A1의 위치를 A옆에 두고자 한다면 A패키지의위치->A1파일 이 되어야 할 것이다.

만약 A1을 A패키지위치->A파일 으로 한다면 원본이 사라지게 될 것이다. (UEditorAssetLibrary::DuplicateAsset 함수 내부적으로 nullptr을 리턴할수도) 이 차이를 잘 구분하자!!

성공적으로 복제했다면 저장해준다. 함수는 UEditorAssetLibrary::SaveAsset.

 

 

추가적으로 언리얼 5.1 로 넘어오면서 (강의는 5.03인데 ObjectPath를 사용..) ObjectPath를 사용하지 않는다고 한다. 대신 GetSoftObjectPath() 함수를 사용하자.

 

위의 기능으로 블루프린트를 5개를 한번에 복제한 결과.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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 31
글 보관함