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

边栏推荐
- [node] NVM version management tool
- 目标检测系列——Faster R-CNN原理详解
- D2L installation
- Intelligent target detection 59 -- detailed explanation of pytoch focal loss and its implementation in yolov4
- 氢氧化钠是什么?
- How to deal with excessive memory occupation of idea and Google browser
- 2022.06.27_每日一题
- Oracle code use
- Play with grpc - go deep into concepts and principles
- 一文揭开,测试外包公司的真实情况
猜你喜欢

iNFTnews | 喝茶送虚拟股票?浅析奈雪的茶“发币”
![[software testing] 03 -- overview of software testing](/img/1e/0b6458160e34e43f021ea4797de70a.jpg)
[software testing] 03 -- overview of software testing

剑指 Offer 56 数组中数字出现的次数(异或)

Shadowless cloud desktop - online computer

C learning notes

【无标题】
![[idea] efficient plug-in save actions to improve your work efficiency](/img/6e/49037333964865d9900ddf5698f7e6.jpg)
[idea] efficient plug-in save actions to improve your work efficiency

Miracast技术详解(一):Wi-Fi Display

Word import literature -mendeley

行测--资料分析--fb--高照老师
随机推荐
Microservice registry Nacos introduction
Ggplot2 drawing learning notes in R
Word import literature -mendeley
window navicat连接阿里云服务器mysql步骤及常见问题
Matrix keyboard scan (keil5)
[untitled]
CADD课程学习(6)-- 获得已有的虚拟化合物库(Drugbank、ZINC)
Rough notes of C language (2) -- constants
ORACLE CREATE SEQUENCE,ALTER SEQUENCE,DROP SEQUENCE
[solved] there is something wrong with the image
[software testing] 06 -- basic process of software testing
CADD course learning (5) -- Construction of chemosynthesis structure with known target (ChemDraw)
Machine learning Seaborn visualization
剑指 Offer 56 数组中数字出现的次数(异或)
selenium 元素定位
M2DGR 多源多场景 地面机器人SLAM数据集
What does soda ash do?
2022.06.27_ One question per day
[node] NVM version management tool
Matrix and TMB package version issues in R