当前位置:网站首页>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
边栏推荐
- Tshydro tool
- Ggplot2 drawing learning notes in R
- [vscode] search using regular expressions
- [software testing] 02 -- software defect management
- 【idea】Could not autowire. No beans of xxx type found
- [software testing] 04 -- software testing and software development
- Course learning accumulation ppt
- Simple operation with independent keys (hey, a little fancy) (keil5)
- Jenkins reported an error. Illegal character: '\ufeff'. Class, interface or enum are required
- Database SQL practice 4. Find the last of employees in all assigned departments_ Name and first_ name
猜你喜欢
【Node】nvm 版本管理工具
Inftnews | drink tea and send virtual stocks? Analysis of Naixue's tea "coin issuance"
PowerManagerService(一)— 初始化
Play with grpc - go deep into concepts and principles
Pytorch has been installed in anaconda, and pycharm normally runs code, but vs code displays no module named 'torch‘
The problem of configuring opencv in qt5.13.2 is solved in detail
[software testing] 06 -- basic process of software testing
And play the little chestnut of dynamic agent
(tool use) how to make the system automatically match and associate to database fields by importing MySQL from idea and writing SQL statements
[software testing] 03 -- overview of software testing
随机推荐
【Node】nvm 版本管理工具
2022.06.27_每日一题
CADD课程学习(5)-- 构建靶点已知的化合结构(ChemDraw)
arcpy. SpatialJoin_ Analysis spatial connection analysis
C learning notes
Matrix keyboard scan (keil5)
2022 PMP project management examination agile knowledge points (7)
NPM and package common commands
PostMessage communication
[solved] there is something wrong with the image
docker安装mysql并使用navicat连接
An article was opened to test the real situation of outsourcing companies
ORACLE CREATE SEQUENCE,ALTER SEQUENCE,DROP SEQUENCE
Line test -- data analysis -- FB -- teacher Gao Zhao
公安基础知识--fb
Unforgettable summary of 2021
Ggplot2 drawing learning notes in R
Energy conservation and creating energy gap
611. 有效三角形的个数
Pytorch has been installed in anaconda, and pycharm normally runs code, but vs code displays no module named 'torch‘