创建自定义SWidget/UWidget,<14-8>用户界面 UI和UMG

这篇博客介绍了如何在Unreal Engine中创建自定义的SWidget类SCustomButton,该类包含TextBlock和点击事件。接着讲解了如何通过UCustomButtonWidget将自定义SWidget封装成UMG可用的组件,允许设计人员在WYSIWYG编辑器中使用。博客详细阐述了SWidget和UWidget之间的关系,以及属性和事件的同步过程。

到目前为止,所有例子已经展示了如何使用现有的基本小部件创建 UI。

有时候,开发者可以使用组合来收集一些 UI 元素来定义一个按钮类,这个按钮类自动将一个 TextBlock 作为标签,而不是每次声明它们时手动指定层次结构。

此外,如果我们在C++中手动指定层次结构,而不是声明一个由子窗口小部件组成的复合对象,那么我们将不能使用 UMG 将这些窗口小部件实例化为一个组。

本例讲述了如何创建一个包含一组小部件并公开新属性以控制这些子小部件的元素的复合 SWidget。 还有如何创建一个 UWidget 包装器,该包装器将向 UMG 公开新的复合 SWidget 类,以便设计人员可以使用它。

首先么再build.cs的模块引用中需要添加UMG。

创建新类:

添加代码:

SCustomButton.h

SCustomButton.cpp


 

 CustomButtonWidget.h
 

> UnrealEditor-Force-Win64-DebugGame.dll!UGameMainMenu::NativeOnInitialized() 行 11 C++ UnrealEditor-UMG.dll!UUserWidget::Initialize() 行 165 C++ UnrealEditor-UMG.dll!UUserWidget::CreateInstanceInternal(UObject * Outer, TSubclassOf<UUserWidget> UserWidgetClass, FName InstanceName, UWorld * World, ULocalPlayer * LocalPlayer) 行 2504 C++ UnrealEditor-UMG.dll!UUserWidget::CreateWidgetInstance(UWidget & OwningWidget, TSubclassOf<UUserWidget> UserWidgetClass, FName WidgetName) 行 2398 C++ UnrealEditor-CommonUI.dll!CreateWidget<UUserWidget,UWidget *>(UWidget * OwningObject, TSubclassOf<UUserWidget> UserWidgetClass, FName WidgetName) 行 1718 C++ UnrealEditor-CommonUI.dll!FUserWidgetPool::AddActiveWidgetInternal<UCommonActivatableWidget>(TSubclassOf<UCommonActivatableWidget> WidgetClass, TFunctionRef<TSharedPtr<SObjectWidget,1> __cdecl(UUserWidget *,TSharedRef<SWidget,1>)> ConstructWidgetFunc) 行 125 C++ [内联框架] UnrealEditor-CommonUI.dll!FUserWidgetPool::GetOrCreateInstance(TSubclassOf<UCommonActivatableWidget>) 行 62 C++ UnrealEditor-CommonUI.dll!UCommonActivatableWidgetContainerBase::AddWidgetInternal(TSubclassOf<UCommonActivatableWidget> ActivatableWidgetClass, TFunctionRef<void __cdecl(UCommonActivatableWidget &)> InitFunc) 行 178 C++ UnrealEditor-Force-Win64-DebugGame.dll!UCommonActivatableWidgetContainerBase::AddWidget<UCommonActivatableWidget>(TSubclassOf<UCommonActivatableWidget> ActivatableWidgetClass, TFunctionRef<void __cdecl(UCommonActivatableWidget &)> InstanceInitFunc) 行 52 C++ UnrealEditor-Force-Win64-DebugGame.dll!UPrimaryGameLayout::PushWidgetToLayerStack<UCommonActivatableWidget>(FGameplayTag LayerName, UClass * ActivatableWidgetClass, TFunctionRef<void __cdecl(UCommonActivatableWidget &)> InitInstanceFunc) 行 109 C++ UnrealEditor-Force-Win64-DebugGame.dll!UPrimaryGameLayout::PushWidgetToLayerStackAsync::__l2::<lambda_1>::operator()() 行 76 C++ UnrealEditor-Force-Win64-DebugGame.dll!TWeakBaseFunctorDelegateInstance<UPrimaryGameLayout,void __cdecl(void),FDefaultDelegateUserPolicy,`UPrimaryGameLayout::PushWidgetToLayerStackAsync<UCommonActivatableWidget>'::`2'::<lambda_1>>::ExecuteIfSafe() 行 972 C++ [内联框架] UnrealEditor-Engine.dll!TDelegate<void __cdecl(void),FDefaultDelegateUserPolicy>::ExecuteIfBound() 行 634 C++ UnrealEditor-Engine.dll!FStreamableDelegateDelayHelper::Tick(float DeltaTime) 行 179 C++ UnrealEditor-Engine.dll!FTickableGameObject::TickObjects(UWorld * World, ELevelTick LevelTickType, bool bIsPaused, float DeltaSeconds) 行 196 C++ UnrealEditor-UnrealEd.dll!UEditorEngine::Tick(float DeltaSeconds, bool bIdleMode) 行 2193 C++ UnrealEditor-UnrealEd.dll!UUnrealEdEngine::Tick(float DeltaSeconds, bool bIdleMode) 行 550 C++ UnrealEditor-Win64-DebugGame.exe!FEngineLoop::Tick() 行 5869 C++ [内联框架] UnrealEditor-Win64-DebugGame.exe!EngineTick() 行 69 C++ UnrealEditor-Win64-DebugGame.exe!GuardedMain(const wchar_t * CmdLine) 行 188 C++ UnrealEditor-Win64-DebugGame.exe!LaunchWindowsStartup(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * __formal, int nCmdShow, const wchar_t * CmdLine) 行 266 C++ UnrealEditor-Win64-DebugGame.exe!WinMain(HINSTANCE__ * hInInstance, HINSTANCE__ * hPrevInstance, char * pCmdLine, int nCmdShow) 行 317 C++ [外部代码] 帮我分析这段调用堆栈,解释引擎内部实现中我作为初学者所需要知道的技术原理,以及项目具体实现中是怎么最终进到这个UI界面初始化的函数中的?
最新发布
09-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值