您好,登錄后才能下訂單哦!
在做系統功能的時候經常需要到服務器去下載圖片然后再顯示,藍圖已經提供了這個接口供大家使用:
如果沒有別的其他需求,那這個接口就夠用了。
不過我們的項目需要在這個接口的基礎上加一些功能:
1.本地緩存(不需要每次都請求)
2.把圖片存放到硬盤(不需要每次重啟游戲都重新下載)
3.設定一個文件數量閾值,超過這個值就刪掉最早的文件
4.判斷一下路徑,如果是本地的圖片直接加載,網絡圖片加載(整合所有圖片加載接口為唯一一個)
因為改動比較多所以不在DownloadImage這個接口上改,重新寫一個類來處理。(具體還是參考他的邏輯來寫)
首先先簡單講一下異步回調的藍圖接口改怎么寫。
1.先繼承藍圖的異步回調基類
class CLIENT_API UImageDownloader : public UBlueprintAsyncActionBase
2.注冊一下回調接口
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FGetImageDelegate, UTexture2D*, Texture);
UPROPERTY(BlueprintAssignable)
FGetImageDelegate OnSuccess;
UPROPERTY(BlueprintAssignable)
FGetImageDelegate OnFail;
這里需要注意一下,回調FGetImageDelegate的聲明記得不要與其他類的名命重復了
3.補充一下構造函數
UImageDownloader::UImageDownloader(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
if (HasAnyFlags(RF_ClassDefaultObject) == false)
{
AddToRoot();
}
}
4.提供唯一接口GetImage(FString URL)
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
static UActImageDownloader* GetImage(FString URL);
大概就是這樣
#pragma once
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "Interfaces/IHttpRequest.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include <map>
#include "ImageDownloader.generated.h"
class UTexture2D;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FGetImageDelegate, UTexture2D*, Texture);
UCLASS()
class CLIENT_API UImageDownloader : public UBlueprintAsyncActionBase
{
//GENERATED_UCLASS_BODY()
GENERATED_BODY()
public:
UImageDownloader(const FObjectInitializer& ObjectInitializer);
UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))
static UActImageDownloader* GetImage(FString URL);
UPROPERTY(BlueprintAssignable)
FGetImageDelegate OnSuccess;
UPROPERTY(BlueprintAssignable)
FGetImageDelegate OnFail;
};
具體邏輯如果有人看再寫吧,公司項目代碼不好復制,需要做專門做一個demo
稍微記錄一下幾個需要注意的點:
1.創建C++類的時候應該從ue編輯器那邊創建,這樣會少一點問題
2.構造函數最好自己寫, 不然經常編譯有問題。自己寫的話要用GENERATED_BODY()
UCLASS()
class CLIENT_API UActImageDownloader : public UBlueprintAsyncActionBase
{
//GENERATED_UCLASS_BODY()
GENERATED_BODY()
3.這一點很重要!我們寫異步回調的,藍圖的執行邏輯是先跑你的函數,再賦值兩個delegate。會導致的問題是,正常下載圖片沒有問題,如果加載本地圖片的話,實際是同步,這時候會找不到OnSuccess和OnFail的代理,也就是這兩個
這時候下面的流程就不走了。。。
解決方式就是,在代碼里加一幀的延時。
//如果直接調用Start的話,獲取網絡回調沒問題,但是獲取本地文件時會出現onsuccess綁的事件找不到的問題
//調用DelayStart,加了個延時一幀調用
FSimpleDelegateGraphTask::CreateAndDispatchWhenReady(
FSimpleDelegateGraphTask::FDelegate::CreateLambda([=]()
{
Start(URL);//這里是你的邏輯
}),
TStatId(),
nullptr,
ENamedThreads::GameThread
);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。