由于UE4在默认情况下会OpenLevel会将当前Level创建的Widget从ViewportClient中移除,所以默认的UserWidget会随着切换关切而消失。
gif过大自行下载查看
有的时候我们可能需要使用一个全局的按钮什么的,所以就需要Widget不随切换关切而从ViewprotClient中移除,而是在我们想要移除的时候才移除,做一个全局的Widget其实也很简单,我只需要稍稍的重写一下UserWidget就好了。
首先创建一个自己的UserWidget子类,然后重写OnLevelRemovedFromWorld函数:
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "GlobalWidget.generated.h"
UCLASS()
class MYPROJECT_API UGlobalWidget : public UUserWidget
{
GENERATED_BODY()
public:
virtual void OnLevelRemovedFromWorld(ULevel* InLevel, UWorld* InWorld) override;
UFUNCTION(BlueprintCallable,Category="GloablWidget")
void RemoveGlobalWidget();
};
#include "GlobalWidget/GlobalWidget.h"
void UGlobalWidget::OnLevelRemovedFromWorld(ULevel* InLevel, UWorld* InWorld)
{
}
void UGlobalWidget::RemoveGlobalWidget()
{
RemoveFromParent();
}
- OnLevelRemovedFromWorld函数就是UserWidget往FWorldDelegates::LevelRemovedFromWorld代理中添加的函数,FWorldDelegates::LevelRemovedFromWorld代理会在Level从World中移除时调用;
- RemoveGlobalWidget是自定义的函数,用于触发从ViewportClient中移除Widget。
然后创建一个GlobalWidget的蓝图类:
然后我们就可看一下效果了:
gif过大自行下载查看
|