Während des Spielentwicklungsprozesses ist es manchmal erforderlich, die Probleme, die beim Ausführen des Spiels auftreten, wie z. B. Konfigurationsfehler und andere Informationen, klar zu melden. Die Fehler müssen nicht nur in der Protokolldatei ausgegeben, sondern auch klar angezeigt werden Fehlerinformationen für Nicht-Programmierer sichtbar. Dann ist das Öffnen der Systemfenster-Eingabeaufforderung eine sehr gute Wahl.
Fall 1:
In UE4 können Sie FMessageDialog::Open
die Funktion verwenden, um einen benutzerdefinierten Nachrichtendialog zu öffnen. Hier ist ein einfaches Beispiel:
#include "Runtime/Engine/Public/Slate/Dialogs/MessageDialog.h"
void AMyTestActor::TestFMessageDialog()
{
FText Title = FText::FromString("My Dialog");
FText Message = FText::FromString("This is a message.The UE invokes the interface and displays the Windows window.Display this information.");
EAppMsgType::Type Type = EAppMsgType::OkCancel;
const EAppReturnType::Type Response = FMessageDialog::Open(Type, Message, &Title);
if (Response == EAppReturnType::Ok)
{
UE_LOG(LogTemp, Log, TEXT("User clicked OK."));
// 处理用户确认...
}
else if (Response == EAppReturnType::Cancel)
{
UE_LOG(LogTemp, Log, TEXT("User clicked Cancel."));
// 处理用户取消...
}
}
In diesem Beispiel verwenden wir FMessageDialog::Open
die Funktion, um einen benutzerdefinierten Nachrichtendialog zu öffnen. Title
Der Parameter gibt den vom Dialogfeld angezeigten Titeltext an, und Message
der Parameter gibt den vom Dialogfeld angezeigten Nachrichtentext an. Type
Der Parameter gibt den Typ der Dialogschaltfläche an.
Wenn der Benutzer im Dialogfeld auf die Schaltfläche „OK“ geklickt hat, FMessageDialog::Open
gibt die Funktion zurück EAppReturnType::Ok
. Andernfalls gibt die Funktion zurück, wenn der Benutzer auf die Schaltfläche „Abbrechen“ geklickt hat EAppReturnType::Cancel
. Sie können diesen Rückgabewert verwenden, um Benutzerauswahlen zu verarbeiten.
Wirkung:
Fall 2:
In UE4 können Sie mit FPlatformMisc::MessageBoxExt
der Funktion den Systemmeldungsdialog öffnen. Hier ist ein einfaches Beispiel:
#include "Runtime/Core/Public/GenericPlatform/GenericPlatformMisc.h"
void AMyTestActor::TestMessageBoxExt()
{
FText Message = FText::FromString("This is a message.");
FText Title = FText::FromString("Message Box");
EAppMsgType::Type Type = EAppMsgType::Ok;
EAppReturnType::Type ret = FPlatformMisc::MessageBoxExt(Type, *Message.ToString(), *Title.ToString());
switch (ret)
{
case EAppReturnType::Ok:
UE_LOG(LogTemp, Log, TEXT("User clicked OK."));
// 处理用户确认...
break;
case EAppReturnType::Cancel:
UE_LOG(LogTemp, Log, TEXT("User clicked Cancel."));
// 处理用户取消...
break;
}
}
In diesem Beispiel verwenden wir FPlatformMisc::MessageBoxExt
die Funktion, um einen einfachen Nachrichtendialog zu öffnen. Message
Der Parameter gibt den vom Dialogfeld angezeigten Nachrichtentext an, und Title
der Parameter gibt den Titel des Dialogfelds an. Type
Der Parameter gibt den Typ der Dialogschaltfläche an.
FPlatformMisc::MessageBoxExt
Die Funktion gibt true zurück , wenn der Benutzer im Dialogfeld auf die Schaltfläche „OK“ geklickt hat . Andernfalls wird false zurückgegeben. Sie können diesen Rückgabewert verwenden, um Benutzerauswahlen zu verarbeiten.
Wirkung:
Referenz:
UE-Engine-Code: ProjectManager.cpp
bool FProjectManager::LoadModulesForProject( const ELoadingPhase::Type LoadingPhase )
{
DECLARE_SCOPE_CYCLE_COUNTER(TEXT("Loading Game Modules"), STAT_GameModule, STATGROUP_LoadTime);
bool bSuccess = true;
if ( CurrentProject.IsValid() )
{
TMap<FName, EModuleLoadResult> ModuleLoadFailures;
FModuleDescriptor::LoadModulesForPhase(LoadingPhase, CurrentProject->Modules, ModuleLoadFailures);
if ( ModuleLoadFailures.Num() > 0 )
{
FText FailureMessage;
for ( auto FailureIt = ModuleLoadFailures.CreateConstIterator(); FailureIt; ++FailureIt )
{
const EModuleLoadResult FailureReason = FailureIt.Value();
if( FailureReason != EModuleLoadResult::Success )
{
const FText TextModuleName = FText::FromName(FailureIt.Key());
if ( FailureReason == EModuleLoadResult::FileNotFound )
{
FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleNotFound", "The game module '{0}' could not be found. Please ensure that this module exists and that it is compiled."), TextModuleName );
}
else if ( FailureReason == EModuleLoadResult::FileIncompatible )
{
FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleIncompatible", "The game module '{0}' does not appear to be up to date. This may happen after updating the engine. Please recompile this module and try again."), TextModuleName );
}
else if ( FailureReason == EModuleLoadResult::FailedToInitialize )
{
FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleFailedToInitialize", "The game module '{0}' could not be successfully initialized after it was loaded."), TextModuleName );
}
else if ( FailureReason == EModuleLoadResult::CouldNotBeLoadedByOS )
{
FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleCouldntBeLoaded", "The game module '{0}' could not be loaded. There may be an operating system error, the module may not be properly set up, or a plugin which has been included into the build has not been turned on."), TextModuleName );
}
else
{
ensure(0); // If this goes off, the error handling code should be updated for the new enum values!
FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleGenericLoadFailure", "The game module '{0}' failed to load for an unspecified reason. Please report this error."), TextModuleName );
}
// Just report the first error
break;
}
}
FMessageDialog::Open(EAppMsgType::Ok, FailureMessage);
bSuccess = false;
}
}
OnLoadingPhaseCompleteEvent.Broadcast(LoadingPhase, bSuccess);
return bSuccess;
}
----