官方项目《内容示例》中Common UI部分笔记: 1.1 Activatable Widgets

本文主要面向UMG以及Common UI的初学者

文章目录

效果展示

概要

这个例子非常简单,定义了1+3个Common Activatable Widget

CommonUI_ActivatableWidgets 相当于一个容器包含了其它3个Common Activatable Widget ,CommonUI_ActivatableWidgets 里没有什么逻辑,窗口弹出/切换的逻辑在CommonUI_BaseLayer 里,CommonUI_BaseLayer 通过变量引用了另外两个Common Activatable Widget

Activate和Deactivate

Activate Widget都干了些什么?

cpp 复制代码
void UCommonActivatableWidget::ActivateWidget()
{
	if (!bIsActive)
	{
		InternalProcessActivation();
	}
}

void UCommonActivatableWidget::InternalProcessActivation()
{
	UE_LOG(LogCommonUI, Verbose, TEXT("[%s] -> Activated"), *GetName());

	bIsActive = true;
	NativeOnActivated();
}

void UCommonActivatableWidget::NativeOnActivated()
{
	if (ensureMsgf(bIsActive, TEXT("[%s] has called NativeOnActivated, but isn't actually activated! Never call this directly - call ActivateWidget()")))
	{
		if (bSetVisibilityOnActivated)
		{
			SetVisibility(ActivatedVisibility);
			UE_LOG(LogCommonUI, Verbose, TEXT("[%s] set visibility to [%s] on activation"), *GetName(), *StaticEnum<ESlateVisibility>()->GetDisplayValueAsText(ActivatedVisibility).ToString());
		}

		if (CommonUI::IsEnhancedInputSupportEnabled() && InputMapping)
		{
			if (const ULocalPlayer* LocalPlayer = GetOwningLocalPlayer())
			{
				if (UEnhancedInputLocalPlayerSubsystem* InputSystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
				{
					InputSystem->AddMappingContext(InputMapping, InputMappingPriority);
				}
			}
		}

		BP_OnActivated();
		OnActivated().Broadcast();
		BP_OnWidgetActivated.Broadcast();
	}
}
cpp 复制代码
	UPROPERTY(EditAnywhere, Category = Activation, meta = (InlineEditConditionToggle = "ActivatedVisibility"))
	bool bSetVisibilityOnActivated = false;

在每个Common Activatable Widget 可以通过Activated Visibility以及Dezctivated Visibility来定义该Common Activatable Widget 被激活/取消激活时的可见性行为

可见性绑定

cpp 复制代码
	/**
	 * Visibilities to use for when bound widgets in BindVisibilityToActivation are activated.
	 *
	 * @param	OnActivatedVisibility	- Visibility for when bound widgets are active
	 * @param	OnDeactivatedVisibility - Visibility for when bound widgets are not active, not used if this widget has activation / deactivation visibilities
	 * @param	bInAllActive			- True if we should switch to activated visibility only when all bound widgets are active
	 */

void UCommonActivatableWidget::SetBindVisibilities(ESlateVisibility OnActivatedVisibility, ESlateVisibility OnDeactivatedVisibility, bool bInAllActive)
{
	ActivatedBindVisibility = OnActivatedVisibility;
	DeactivatedBindVisibility = OnDeactivatedVisibility;
	bAllActive = bInAllActive;
}

	/**
	 * Bind our visibility to the activation of another widget, useful for making mouse collisions behave similiar to console navigation w.r.t activation
	 * Will immediately update visibility based on the bound widget activation & visibilites set by SetBindVisibilities.
	 *
	 * @param	ActivatableWidget		- The widget whose activation / deactivation will modify our visibility 
	 */

void UCommonActivatableWidget::BindVisibilityToActivation(UCommonActivatableWidget* ActivatableWidget)
{
	if (ActivatableWidget && !VisibilityBoundWidgets.Contains(ActivatableWidget))
	{
		VisibilityBoundWidgets.Add(ActivatableWidget);
		ActivatableWidget->OnActivated().AddUObject(this, &UCommonActivatableWidget::HandleVisibilityBoundWidgetActivations);
		ActivatableWidget->OnDeactivated().AddUObject(this, &UCommonActivatableWidget::HandleVisibilityBoundWidgetActivations);

		HandleVisibilityBoundWidgetActivations();
	}
}

UI动画

动画播放及用动画触发UI切换

设置Common Activatable Widget的默认焦点

覆盖BP_FetDesiredFocusTarget

相关推荐
心怀梦想的咸鱼19 小时前
UE5 第一人称射击项目学习(二)
学习·ue5
暮志未晚Webgl19 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
心怀梦想的咸鱼19 小时前
UE5 第一人称射击项目学习(完结)
学习·ue5
云璃丶夢紡2 天前
用源码编译虚幻引擎,并打包到安卓平台
android·游戏引擎·虚幻
暮志未晚Webgl2 天前
110. UE5 GAS RPG 实现玩家角色数据存档
java·前端·ue5
Zhichao_973 天前
【UE5】Slider控件样式
ue5
流行易逝3 天前
23.UE5删除存档
ue5
心怀梦想的咸鱼3 天前
UE5 第一人称射击项目学习(三)
学习·ue5
流行易逝3 天前
22.UE5控件切换器,存档列表,
ue5
[小瓜]4 天前
高级AI记录笔记(三)
人工智能·笔记·学习·ue5·虚幻