当前位置:网站首页>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

边栏推荐
- SD_ CMD_ SEND_ SHIFT_ REGISTER
- [vscode] prohibit the pylance plug-in from automatically adding import
- selenium 元素定位
- PowerManagerService(一)— 初始化
- Mipi interface, DVP interface and CSI interface of camera
- The number of occurrences of numbers in the offer 56 array (XOR)
- [node] NVM version management tool
- Basic series of SHEL script (III) for while loop
- Miracast技术详解(一):Wi-Fi Display
- U-boot initialization and workflow analysis
猜你喜欢

How to deal with excessive memory occupation of idea and Google browser

2022年PMP项目管理考试敏捷知识点(7)

【Node】nvm 版本管理工具
![[untitled]](/img/d5/2ac2b15818cf66c241e307c6723d50.jpg)
[untitled]

Unforgettable summary of 2021

PostMessage communication
![[software testing] 04 -- software testing and software development](/img/bd/49bba7ee455ce59e726a2fdeafc7c3.jpg)
[software testing] 04 -- software testing and software development

How to delete the virus of inserting USB flash disk copy of shortcut to

CADD课程学习(6)-- 获得已有的虚拟化合物库(Drugbank、ZINC)

C learning notes
随机推荐
Negative number storage and type conversion in programs
Jenkins reported an error. Illegal character: '\ufeff'. Class, interface or enum are required
借助 Navicat for MySQL 软件 把 不同或者相同数据库链接中的某数据库表数据 复制到 另一个数据库表中
611. 有效三角形的个数
Basic series of SHEL script (III) for while loop
Line test -- data analysis -- FB -- teacher Gao Zhao
【Node】nvm 版本管理工具
ImportError: No module named ‘Tkinter‘
CADD course learning (5) -- Construction of chemosynthesis structure with known target (ChemDraw)
ORACLE CREATE SEQUENCE,ALTER SEQUENCE,DROP SEQUENCE
剑指 Offer 56 数组中数字出现的次数(异或)
[vscode] prohibit the pylance plug-in from automatically adding import
Anaconda navigator click open no response, can not start error prompt attributeerror: 'STR' object has no attribute 'get‘
2022年PMP项目管理考试敏捷知识点(7)
Rough notes of C language (2) -- constants
Import CV2, prompt importerror: libcblas so. 3: cannot open shared object file: No such file or directory
Batch convert txt to excel format
[software testing] 05 -- principles of software testing
1290_ Implementation analysis of prvtaskistasksuspended() interface in FreeRTOS
selenium 元素定位