公式プロジェクト「コンテンツ例」の共通UIに関する注意事項: 1.1 起動可能なウィジェット

この記事は主に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 VisibilityDezctivated VisibilityCommon 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

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/hello_tute/article/details/132526124