この記事は主にUMGと共通UIの初心者向けです。
結果を示す
概要
この例は非常に単純で、1+3 を定義しています。Common Activatable Widget
CommonUI_ActivatableWidgets は、他の 3 つを含むコンテナに相当します。 CommonUI_ActivatableWidgetsにはロジックはありません。ウィンドウのポップアップ/切り替えのロジックはCommonUI_BaseLayerにあります。CommonUI_BaseLayer は、変数を通じて他の 2 つを参照しますCommon Activatable Widget
。Common Activatable Widget
アクティブ化と非アクティブ化
ウィジェットのアクティブ化は何をしますか?
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();
}
}
UPROPERTY(EditAnywhere, Category = Activation, meta = (InlineEditConditionToggle = "ActivatedVisibility"))
bool bSetVisibilityOnActivated = false;
アクティブ化/非アクティブ化された可視性の動作も各ビアで定義Common Activatable Widget
できます。Activated Visibility
Dezctivated Visibility
Common Activatable Widget
可視性バインディング
/**
* 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 切り替えのトリガー
共通のアクティブ化可能なウィジェットのデフォルトのフォーカスを設定します
カバーBP_FetDesiredFocusTarget