Код: Выделить всё
#pragma once
#include "CoreMinimal.h"
#include "Styling/SlateStyle.h"
class FTestCustomStyle final
{
public:
static void Initialize();
static void Shutdown();
static ISlateStyle& Get()
{
return *StyleSet.Get();
}
static FName GetStyleSetName();
private:
UPROPERTY()
static TUniquePtr StyleSet;
static FString RootToProjectContentDir(const FString& RelativePath, const TCHAR* Extension);
};
#include "TestCustomStyle.h"
#include "Styling/CoreStyle.h"
#include "Styling/SlateStyleRegistry.h"
TUniquePtr FTestCustomStyle::StyleSet;
void FTestCustomStyle::Initialize()
{
if (StyleSet.IsValid())
{
// Only set up once
return;
}
StyleSet = MakeUnique(GetStyleSetName());
//~ Begin styles def
StyleSet->SetContentRoot(FPaths::EngineContentDir() / TEXT("Editor/Slate"));
StyleSet->SetCoreContentRoot(FPaths::EngineContentDir() / TEXT("Slate"));
// Text
StyleSet->Set("TitleTextStyle", FTextBlockStyle()
.SetFont(FCoreStyle::GetDefaultFontStyle("Bold", 34))
.SetColorAndOpacity(FLinearColor::FromSRGBColor(FColor::FromHex(TEXT("#FFFFFF"))))
);
//~ End styles def
FSlateStyleRegistry::RegisterSlateStyle(*StyleSet.Get());
}
void FTestCustomStyle::Shutdown()
{
if (StyleSet.IsValid())
{
FSlateStyleRegistry::UnRegisterSlateStyle(*StyleSet.Get());
StyleSet.Reset();
}
}
FName FTestCustomStyle::GetStyleSetName()
{
static const FName StyleSetName(TEXT("TestCustomStyle"));
return StyleSetName;
}
FString FTestCustomStyle::RootToProjectContentDir(const FString& RelativePath, const TCHAR* Extension)
{
static const FString ContentDir = FPaths::ProjectConfigDir();
return (ContentDir / RelativePath) + Extension;
}
< /code>
И я называю методы инициализации и выключения стиля в методах запуска и выключения моего основного модуля: < /p>
#pragma once
#include "CoreMinimal.h"
class FTestGameModule : public FDefaultGameModuleImpl
{
public:
void StartupModule() override;
void ShutdownModule() override;
};
< /code>
#include "TestGame.h"
#include "TestCustomStyle.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE(FDefaultGameModuleImpl, TestGame, "TestGame")
void FTestGameModule::StartupModule()
{
FTestCustomStyle::Initialize();
}
void FTestGameModulee::ShutdownModule()
{
FTestCustomStyle::Shutdown();
}
< /code>
However, when I try to use the style set in my custom widget, I get the above error:
#include "UI/Menus/STestMenu.h"
#include "UI/HUD/DefaultHUD.h"
#include "TestCustomStyle.h"
#define LOCTEXT_NAMESPACE "TestMenu"
void STestMenu::Construct(const FArguments& InArgs)
{
bCanSupportFocus = true;
OwningHUD = InArgs._OwningHUD;
const FText TitleText = LOCTEXT("TitleText", "Test");
ChildSlot
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
// Header
SNew(SVerticalBox)
+ SVerticalBox::Slot()
[
SNew(STextBlock)
.TextStyle(FTestCustomStyle::Get(), "TitleTextStyle")
.Text(TitleText)
]
];
}
< /code>
When I remove the custom styling from the equation, it works fine, so I know it's specific to that.
Подробнее здесь: https://stackoverflow.com/questions/794 ... lation-thr