当前位置:网站首页>Ue5 hot update - remote server automatic download and version detection (simplehotupdate)

Ue5 hot update - remote server automatic download and version detection (simplehotupdate)

2022-07-05 07:27:00 Human house

Hello, everyone , My name is Renzhai , I'm glad to explain the above content to you :

Hot update plugin  SimpleHotUpdate  When using, many people don't know how to automatically download the hot update resources deployed at the remote end . I also often solve this problem remotely , Solved a lot , All the discoveries are The same question , Here is an article about how to automatically deploy code for hot update :

Just copy the following code to your own project Source Inside :


1. Directory structure

With MMOARPG Engineering as an example

2. In their own projects build.cs Lower include SimpleHotUpdate and UMG modular It's better to put Slate  and SlateCore Also on

3. Copy the following code into your own code file

UI_HotUpdateMain.h

//Copyright (C) RenZhai.2022.All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "UI_HotUpdateMain.generated.h"

class UTextBlock;
class UProgressBar;
class UVersionControlObject;
enum class EServerVersionResponseType :uint8;
/**
 * 
 */
UCLASS()
class UUI_HotUpdateMain : public UUserWidget
{
	GENERATED_BODY()

	UPROPERTY(meta = (BindWidget))
	UTextBlock* TipText;

	UPROPERTY(meta = (BindWidget))
	UTextBlock* VersionName;

	UPROPERTY(meta = (BindWidget))
	UTextBlock* DownloadSpeedText;

	UPROPERTY(meta = (BindWidget))
	UTextBlock* DownloadedResourceName;
	
	UPROPERTY(meta = (BindWidget))
	UTextBlock* DownloadDataSize;

	UPROPERTY(meta = (BindWidget))
	UProgressBar* DownLoadProgress;

	UPROPERTY()
	UVersionControlObject* VersionControlObject;

public:
	UUI_HotUpdateMain(const FObjectInitializer& ObjectInitializer);

	virtual void NativeConstruct();
	virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime);
	virtual void NativeDestruct();

private:
	UFUNCTION()
	void PlayHotUpdateAnim();

	UFUNCTION()
	void PlayTipAnim();

	UFUNCTION()
	void Downloading(float InValue, const FString& InName, int32 TotalBytes, int32 BytesReceived);
	
	UFUNCTION()
	void CheckVersion(EServerVersionResponseType InType);

	void ResetTime();
private:
	float PlayAnimTime;// Play animation time 

	int32 LastDownloadSize;// Last downloaded size 
	float DownloadTime;// Download timekeeping 
	bool bReset;// Recapture download time 
	int32 PreSReceived;// How many bytes of data are downloaded per second 
};

UI_HotUpdateMain.cpp

//Copyright (C) RenZhai.2022.All Rights Reserved.

#include "UI_HotUpdateMain.h"
#include "Components/TextBlock.h"
#include "Components/ProgressBar.h"
#include "Object/SimpleHotUpdateObject.h"
//#include "ThreadManage.h"
#include "Kismet/GameplayStatics.h"

#define LOCTEXT_NAMESPACE "UI_HotUpdateMain"

UUI_HotUpdateMain::UUI_HotUpdateMain(const FObjectInitializer& ObjectInitializer)
	:Super(ObjectInitializer)
	, PlayAnimTime(10.f)
	, LastDownloadSize(0)
	, DownloadTime(0.f)
	, bReset(false)
	, PreSReceived(0)
{

}

void UUI_HotUpdateMain::NativeConstruct()
{
	Super::NativeConstruct();

	VersionControlObject = UVersionControlObject::CreateObject(UVersionControlObject::StaticClass(), GetWorld());
	if (VersionControlObject)
	{
		VersionControlObject->ProgressDelegate.BindUObject(this, &UUI_HotUpdateMain::Downloading);
		VersionControlObject->VersionDelegate.BindUObject(this, &UUI_HotUpdateMain::CheckVersion);

		VersionControlObject->InitVersion();

		// Play prompt animation 
		PlayTipAnim();
	}
}

void UUI_HotUpdateMain::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)
{
	Super::NativeTick(MyGeometry, InDeltaTime);

	// Animation play 
	{
		PlayAnimTime += InDeltaTime;
		if (PlayAnimTime >= 10.f)
		{
			PlayAnimTime = 0.f;

			PlayHotUpdateAnim();
		}
	}

	// Time capture record 
	{
		DownloadTime += InDeltaTime;
		if (DownloadTime >= 1.f)
		{
			DownloadTime = 0.f;
			ResetTime();
		}
	}
}

void UUI_HotUpdateMain::NativeDestruct()
{
	Super::NativeDestruct();
}

void UUI_HotUpdateMain::Downloading(float InValue, const FString& InName, int32 TotalBytes, int32 BytesReceived)
{
	// Need real-time display 
	if (DownLoadProgress)
	{
		// Print download progress 
		DownLoadProgress->SetPercent(InValue);
	}

	// Update the print display every second 
	if (bReset)
	{
		bReset = false;

		FNumberFormattingOptions FormattingOptions;
		FormattingOptions.MaximumFractionalDigits = 1;// After decimal point 1 position 

		if (DownloadedResourceName)
		{
			// Remove suffix 
			FString ContentName = InName;
			ContentName.RemoveFromEnd(FPaths::GetExtension(ContentName, true));

			// Print name 
			DownloadedResourceName->SetText(FText::FromString(ContentName));
		}

		if (DownloadDataSize)
		{
			// Print size 
			DownloadDataSize->SetText(
				FText::Format(LOCTEXT("Downloading_DownloadDataSize", "{0} / {1}"),
					FText::AsMemory(TotalBytes, &FormattingOptions),
					FText::AsMemory(BytesReceived, &FormattingOptions)));
		}

		if (VersionControlObject)
		{
			bReset = false;
			PreSReceived = BytesReceived - LastDownloadSize;
			LastDownloadSize = BytesReceived;

			DownloadSpeedText->SetText(FText::Format(LOCTEXT("Downloading_DownloadSpeed", "{0} / s"),
				FText::AsMemory(PreSReceived, &FormattingOptions)));
			
			// Set the version name 
			VersionName->SetText(FText::Format(LOCTEXT("Downloading_Version", "{0}->{1}"),
				FText::FromString(VersionControlObject->GetClientVersionName()),
				FText::FromString(VersionControlObject->GetServerVersionName())));
		}
	}
}

void UUI_HotUpdateMain::CheckVersion(EServerVersionResponseType InType)
{
	if (InType == EServerVersionResponseType::EQUAL)
	{
		//GThread::Get()->GetCoroutines().BindLambda(2.f, [&]()
		//{
		//	UGameplayStatics::OpenLevel(GetWorld(), TEXT("Login"));
		//});
	}
}

void UUI_HotUpdateMain::ResetTime()
{
	bReset = true;
}

void UUI_HotUpdateMain::PlayHotUpdateAnim()
{
	//if (UWidgetAnimation* InAnim = GetNameWidgetAnimation(TEXT("PlayAnimRenzhai")))
	//{
	//	PlayAnimation(InAnim);
	//}
}

void UUI_HotUpdateMain::PlayTipAnim()
{
	//if (UWidgetAnimation* InAnim = GetNameWidgetAnimation(TEXT("TipAnim")))
	//{
	//	PlayAnimation(InAnim);
	//}
}

#undef LOCTEXT_NAMESPACE

5. Create a UMG The blueprint , Fill in the missing fonts according to the format

Fill in the contents of these warnings

6. Create a blueprint , Put this UI Paste to viewport

原网站

版权声明
本文为[Human house]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207050723052300.html