ue4加載界面(loadingscreen)的實現


即使開放世界已然成為現今游戲趨勢,切換關卡過程中的讀條仍是很難避免的,譬如進入房屋、傳送到其他世界等等。

於是就引入了loadingscreen這一需求。

loadingscreen顧名思義就是加載過程中通過其他線程顯示的畫面,可以是真讀條(顯示當前進度),也可以僅僅轉着圈,循環播放某段視頻。

我們首先需要新建c++類MyGameInstance繼承自GameInstance,並在項目設置中將其設為當前使用的

這里我先創建了一個繼承自MyGameInstance的藍圖,叫bp_MyGameInstance。

開始寫代碼之前,還有這些准備工作:

1.在projectname.build.cs文件中增加"MoviePlayer","UMG", "Slate", "SlateCore"幾項

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject",
            "Engine", "InputCore", "HeadMountedDisplay",
            "MoviePlayer",
            "UMG", "Slate", "SlateCore"});

 

2.在projectname.h中包含一些頭文件

#include "Runtime/UMG/Public/UMG.h"
#include "Runtime/UMG/Public/UMGStyle.h"
#include "Runtime/UMG/Public/Slate/SObjectWidget.h"
#include "Runtime/UMG/Public/IUMGModule.h"
#include "Runtime/UMG/Public/Blueprint/UserWidget.h"

#include "Runtime/MoviePlayer/Public/MoviePlayer.h"
#include "Runtime/SlateCore/Public/Widgets/SWidget.h"

 

然后重寫gameinstance中的這個函數

virtual void Init() override;
void UMyGameInstance::Init()
{
    UGameInstance::Init();

    FCoreUObjectDelegates::PreLoadMap.AddUObject(this,     &UMyGameInstance::BeginLoadingScreen);
    FCoreUObjectDelegates::PostLoadMap.AddUObject(this, &UMyGameInstance::EndLoadingScreen);
}

 

接下來這兩個函數

UFUNCTION()
    virtual void BeginLoadingScreen(const FString& MapName);
UFUNCTION()
    virtual void EndLoadingScreen();
void UMyGameInstance::BeginLoadingScreen(const FString& MapName)
{
    
    loadlevel_count++;
    if (!IsRunningDedicatedServer())
    {

        FLoadingScreenAttributes LoadingScreen;
        LoadingScreen.bAutoCompleteWhenLoadingCompletes = false;
        LoadingScreen.bMoviesAreSkippable = true;//任意鍵打斷如果加載完成
        LoadingScreen.bWaitForManualStop = true;//
        LoadingScreen.PlaybackType = EMoviePlaybackType::MT_Looped;

        
        //不知道怎么destroy..
        inWidget = CreateWidget<UUserWidget>(this, WidgetTemplate);//應該有垃圾回收
        
        TSharedPtr<SWidget> WidgetPtr = inWidget->TakeWidget();
        LoadingScreen.WidgetLoadingScreen = WidgetPtr;
        
        LoadingScreen.MoviePaths.Add("squad_intro_movie");
        GetMoviePlayer()->SetupLoadingScreen(LoadingScreen);
        
    }
}

void UMyGameInstance::EndLoadingScreen()
{
    
    if (!IsRunningDedicatedServer())
    {

    }
}

 

上文中的squad_intro_movie其實是Content\Movies目錄下的squad_intro_movie.mp4文件,不需要后綴名,要注意不是將其拖到編輯器中,而是把mp4文件復制到實際工程文件目錄里。

而WidgetTemplate則是mygameinstance暴露到藍圖的用於Loadingscreen的控件類,

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = UI)
        TSubclassOf<UUserWidget> WidgetTemplate;
UUserWidget* inWidget = NULL;

inWidget才是真正被create出來的控件對象,雖然每次loading都新create了一次,但是ue4對控件應該有自己的垃圾回收機制。

至於控件藍圖,需要從mygameinstance中獲取當前loading是否完成

UFUNCTION(BlueprintPure, Category = MyGameInstance)
        bool myisloadingfinished();
bool UMyGameInstance::myisloadingfinished()
{
    
    return GetMoviePlayer()->IsLoadingFinished();
}

我的loadingscreen控件藍圖目前只包含三樣東西:

加載過程中throbber(就是那個點點點)顯示,而“請按任意鍵繼續”的文本隱藏;

加載完成時反之。

textblock的visibility函數:

點點點的visibility函數:

 

 要注意的是點擊視口中運行並不能看到效果,需要選擇獨立窗口運行。

然后就大功告成啦!!!這里借用了一下squad的小視頻

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM