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`,并传递参数。

相关推荐
5***o5003 天前
PHP在电商中的支付集成
sql·ue5·rizomuv
AA陈超5 天前
从0开始学习 **Lyra Starter Game** 项目
c++·笔记·学习·游戏·ue5·lyra
AA陈超10 天前
以 Lyra 的架构为基础,创建一个名为 “Aura“ 的英雄并实现发射火球技能
c++·笔记·学习·ue5·lyra
AA陈超10 天前
Lyra项目中的输入系统
c++·笔记·学习·游戏·ue5·lyra
AA陈超10 天前
ASC学习笔记0027:直接设置属性的基础值,而不会影响当前正在生效的任何修饰符(Modifiers)
c++·笔记·学习·ue5·虚幻引擎
开发游戏的老王10 天前
UE5.6 C++项目升级UE5.7时用Rider加载项目失败的解决办法
ue5·游戏引擎·虚幻·虚幻引擎·rider·ue5.7·target.cs
AA陈超10 天前
ASC学习笔记0020:用于定义角色或Actor的默认属性值
c++·笔记·学习·ue5·虚幻引擎
平行云10 天前
World Labs & Paraverse:统一3D世界的创造与访问
3d·unity·ai·ue5·aigc·实时云渲染·云xr
AA陈超11 天前
使用UnrealEngine引擎,实现鼠标点击移动
c++·笔记·学习·ue5·虚幻引擎
AA陈超11 天前
Lyra源码分析:LyraCharacterMovementComponent
c++·笔记·学习·ue5·虚幻引擎·lyra