UE5 C++ 下载视频到本地。//BindLambda用法解析

cpp 复制代码
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "HttpModule.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"
#include "GameFramework/Actor.h"
#include "A_Hbt_AsyncDownloadFile.generated.h"

DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FDownloadResultDelegate, bool, bSuccess, FString, FilePath);
UCLASS()
class AIEASEMAN3PROJECT_API AA_Hbt_AsyncDownloadFile : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AA_Hbt_AsyncDownloadFile();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;
	
	/*视频下载*/

public:
	UFUNCTION(BlueprintCallable, Category = "Video Downloader")
	void DownloadVideoInBlueprint(const FString& URL, const FString& SavePath);

private:
	// 下载视频文件


	// HTTP 请求完成时的回调函数
	void OnDownloadComplete(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, const FString& SavePath);
};
cpp 复制代码
// Fill out your copyright notice in the Description page of Project Settings.


#include "A_Hbt_AsyncDownloadFile.h"

// Sets default values
AA_Hbt_AsyncDownloadFile::AA_Hbt_AsyncDownloadFile()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void AA_Hbt_AsyncDownloadFile::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AA_Hbt_AsyncDownloadFile::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

void AA_Hbt_AsyncDownloadFile::DownloadVideoInBlueprint(const FString& URL, const FString& SavePath)
{    // 创建 HTTP 请求
    TSharedRef<IHttpRequest, ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest();
    HttpRequest->SetVerb("GET"); // 使用 GET 方法下载文件
    HttpRequest->SetURL(URL);    // 设置下载的 URL

    // 绑定回调函数
    //HttpRequest->OnProcessRequestComplete().BindUObject(this, &AA_Hbt_AsyncDownloadFile::OnDownloadComplete, *SavePath);
    HttpRequest->OnProcessRequestComplete().BindLambda(
        [this, SavePath](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) {
             this->OnDownloadComplete(Request, Response, bWasSuccessful, SavePath);
         }
     );
    // 发送请求
    HttpRequest->ProcessRequest();
}


void AA_Hbt_AsyncDownloadFile::OnDownloadComplete(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, const FString& SavePath)
{
    if (bWasSuccessful && Response.IsValid())
    {
        // 获取下载的数据
        const TArray<uint8>& Data = Response->GetContent();

        // 将数据写入文件
        if (FFileHelper::SaveArrayToFile(Data, *SavePath))
        {
            UE_LOG(LogTemp, Display, TEXT("视频下载成功,保存路径:%s"), *SavePath);
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("文件保存失败!"));
        }
    }
    else
    {
        UE_LOG(LogTemp, Error, TEXT("下载失败!"));
    }
}

用法解析

cpp 复制代码
    HttpRequest->OnProcessRequestComplete().BindLambda(
        [this, SavePath](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) {
             this->OnDownloadComplete(Request, Response, bWasSuccessful, SavePath);
         }
     );

1.Lambda 表达式的基本结构

捕获列表\](参数列表) { 函数体 } 2.用噶 * **`[this, SavePath]`** :捕获列表,表示 Lambda 可以访问当前对象的 `this` 指针和局部变量 `SavePath`。 * **`(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)`** :参数列表,与 `OnProcessRequestComplete` 回调的签名一致。 * **`{ 函数体 }`** :调用成员函数 `OnDownloadComplete`,并传递参数。

相关推荐
AA陈超13 小时前
虚幻引擎UE5专用服务器游戏开发-20 添加基础能力类与连招能力
c++·游戏·ue5·游戏引擎·虚幻
平行云21 小时前
如何实现UE程序大并发多集群的像素流部署
unity·ue5·图形渲染
不爱说话的采儿2 天前
UE5详细保姆教程(第四章)
笔记·ue5·游戏引擎·课程设计
二DUAN帝2 天前
UE实现路径回放、自动驾驶功能简记
人工智能·websocket·机器学习·ue5·自动驾驶·ue4·cesiumforue
温玉琳琅3 天前
【UE5】虚幻引擎小百科
ue5·游戏引擎·虚幻
远离UE44 天前
UE 材质 变体 概念
ue5·材质
吴梓穆6 天前
UE5 重新编译插件版本
ue5
HECUgauss6 天前
UE5 使用过程遇到的问题
ue5
小白学过的代码6 天前
ue5.4和webul通信
开发语言·javascript·ue5