구현 목표

이전 편들에서 아쉬운 점이 하나 있었습니다. 바로 결과를 출력하는 방식이 아쉬웠는데요. 에디터 화면에 메시지를 띄우거나 로그 콘솔에 남기는 방식을 사용했습니다. 이는 멋있지 않아요. 그렇죠? 그래서 좀 더 알림 창 같은 알림창을 만들어보도록 하겠습니다.


구현 과정

1) 정의

들어가며

오늘은 최종적으로 2가지 형태의 알림 창을 만들 예정입니다. 두 내용다 어렵지 않아서 쉽게 구현할 수 있을거에요.

FMessageDialog

FMessageDialog 공식문서

이 클래스는 대화상자를 실행하는 클래스입니다. 대화상자는 사진과 같이 기본 형의 대화상자가 있고 사용자의 입력을 받을 수 있는 입력형 대화상자가 있습니다.

파라미터를 통해 원하는 모습을 자유롭게 구현할 수 있기때문에 각자 원하는 형태로 출력해보도록 해요.

Unreal Message Dialog

Notification

Notifications 공식문서
FSlateNotificationManager 공식문서

언리얼에서 제공하는 여러 형태의 노티피케이션

언리얼에서 제공하는 여러 형태의 노티피케이션

노티피케이션(이하 노티) 기능은 위 사진과 같이 에디터의 우측 하단에 출력되며, 다이얼로그와 마찬가지로 여러 형태를 지원하기 때문에 자신이 원하는 노티를 생성할 수 있어요. 노티는 리스트를 작성하고 노티 매니저를 통해 출력하는 형태라는 점을 기억해주세요.

2) 분석

MessageDialog

1
2
3
4
5
6
if (NumOfAssets <= 0)
{
const FText MessageTitle = FText::FromString(TEXT("경고"));
FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(TEXT("유효한 값을 입력해주세요.")), MessageTitle);
return;
}
  • FMessageDialog는 Open() 메서드를 통해 생성할 수 있습니다.
  • 총 3가지의 파라미터를 가지며 앞에서 부터 타입, 내용, 타이틀 순입니다.
  • 메시지 타입에는 여러가지가 있으면 한번 살펴보는 것을 추천드려요.

Notify

1
2
3
4
5
6
7
if (Counter > 0)
{
FNotificationInfo NotifyInfo(FText::FromString(FString::FromInt(Counter) + TEXT("개의 파일이 복제되었습니다.")));
NotifyInfo.FadeOutDuration = 7.f;

FSlateNotificationManager::Get().AddNotification(NotifyInfo);
}
  • FNotificationInfo 형태의 노티를 생성합니다.
  • 노티의 형태 역시 여러가지가 있으므로 하나씩 살펴 보시는 것을 추천드려요.
  • 이후 노티매니저에 노티를 추가하면됩니다.
  • 노티 매니저는 싱글톤으로 구현되어 있어며, 가지고 있는 노티를 윈도우에 플로팅 해줍니다.

최종코드

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
32
33
34
35
36
void UQuickAssetAction::DuplicateAssets(int32 NumOfAssets)
{
if (NumOfAssets <= 0)
{
const FText MessageTitle = FText::FromString(TEXT("경고"));
FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(TEXT("유효한 값을 입력해주세요.")), MessageTitle);
return;
}

TArray<FAssetData> SelectedAssetData = UEditorUtilityLibrary::GetSelectedAssetData();
uint32 Counter = 0;

for (const FAssetData& AssetData : SelectedAssetData)
{
for (int i = 0; i < NumOfAssets; ++i)
{
const FString SourceAssetPath = AssetData.GetObjectPathString();
const FString NewDuplicateAssetName = AssetData.AssetName.ToString() + TEXT("_") + FString::FromInt(i + 1);
const FString NewPathName = FPaths::Combine(AssetData.PackagePath.ToString(), NewDuplicateAssetName);

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

if (Counter > 0)
{
FNotificationInfo NotifyInfo(FText::FromString(FString::FromInt(Counter) + TEXT("개의 파일이 복제되었습니다.")));
NotifyInfo.FadeOutDuration = 7.f;

FSlateNotificationManager::Get().AddNotification(NotifyInfo);
}
}

3) 예시

스크린샷 2024-03-03 155055.png

스크린샷 2024-03-03 155102.png

스크린샷 2024-03-03 155727.png


마무리

각각의 출력 방식 마다 장단점이 있겠지만, 대화상자와 알림창은 편리하면서도 멋지게 알림 내역을 보여줄 수 있었던 것 같아요. 각자 편리하고 원하는 방식을 이용해서 출력해보도록 합시다. 감사합니다. 다음 편에는 더 재밌고 유용한 글을 써보겠습니다. 그럼 다음 게시글에서 뵙겠습니다.