当前位置:网站首页>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
边栏推荐
- 借助 Navicat for MySQL 软件 把 不同或者相同数据库链接中的某数据库表数据 复制到 另一个数据库表中
- arcgis_ spatialjoin
- What does soda ash do?
- 纯碱是做什么的?
- 剑指 Offer 56 数组中数字出现的次数(异或)
- Three body goal management notes
- R language learning notes 1
- [vscode] prohibit the pylance plug-in from automatically adding import
- [software testing] 03 -- overview of software testing
- Basic series of SHEL script (II) syntax + operation + judgment
猜你喜欢
Target detection series - detailed explanation of the principle of fast r-cnn
Intelligent target detection 59 -- detailed explanation of pytoch focal loss and its implementation in yolov4
SD_ CMD_ SEND_ SHIFT_ REGISTER
docker安装mysql并使用navicat连接
HDU1232 畅通工程(并查集)
M2DGR 多源多场景 地面机器人SLAM数据集
UE5热更新-远端服务器自动下载和版本检测(SimpleHotUpdate)
Ethtool principle introduction and troubleshooting ideas for network card packet loss (with ethtool source code download)
Anaconda navigator click open no response, can not start error prompt attributeerror: 'STR' object has no attribute 'get‘
HDU1231 最大连续子序列(分治or动规or双指针)
随机推荐
SD_ CMD_ RECEIVE_ SHIFT_ REGISTER
[OBS] x264 Code: "buffer_size“
Import CV2, prompt importerror: libcblas so. 3: cannot open shared object file: No such file or directory
Solve tensorfow GPU modulenotfounderror: no module named 'tensorflow_ core. estimator‘
Database SQL practice 3. Find the current salary details of the current leaders of each department and their corresponding department number Dept_ no
docker安装mysql并使用navicat连接
[software testing] 06 -- basic process of software testing
Graduation thesis project local deployment practice
(top) pretty girl binary color code portal
NPM and package common commands
Daily Practice:Codeforces Round #794 (Div. 2)(A~D)
Altimeter data knowledge point 2
[tf1] save and load parameters
Rough notes of C language (1)
公安专业知识--哔哩桐老师
PostMessage communication
Oracle code use
Machine learning Seaborn visualization
并查集理论讲解和代码实现
Simple use of timeunit