中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【UE4實用技能】寫一個異步回調的藍圖接口

發布時間:2020-05-28 18:22:11 來源:網絡 閱讀:2964 作者:xiaosongfang 欄目:游戲開發

在做系統功能的時候經常需要到服務器去下載圖片然后再顯示,藍圖已經提供了這個接口供大家使用:
【UE4實用技能】寫一個異步回調的藍圖接口

如果沒有別的其他需求,那這個接口就夠用了。

不過我們的項目需要在這個接口的基礎上加一些功能:
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編輯器那邊創建,這樣會少一點問題
【UE4實用技能】寫一個異步回調的藍圖接口

2.構造函數最好自己寫, 不然經常編譯有問題。自己寫的話要用GENERATED_BODY()

UCLASS()
class CLIENT_API UActImageDownloader : public UBlueprintAsyncActionBase
{
    //GENERATED_UCLASS_BODY()
    GENERATED_BODY()

3.這一點很重要!我們寫異步回調的,藍圖的執行邏輯是先跑你的函數,再賦值兩個delegate。會導致的問題是,正常下載圖片沒有問題,如果加載本地圖片的話,實際是同步,這時候會找不到OnSuccess和OnFail的代理,也就是這兩個
【UE4實用技能】寫一個異步回調的藍圖接口
這時候下面的流程就不走了。。。
解決方式就是,在代碼里加一幀的延時。

    //如果直接調用Start的話,獲取網絡回調沒問題,但是獲取本地文件時會出現onsuccess綁的事件找不到的問題
    //調用DelayStart,加了個延時一幀調用
    FSimpleDelegateGraphTask::CreateAndDispatchWhenReady(
        FSimpleDelegateGraphTask::FDelegate::CreateLambda([=]() 
    {
        Start(URL);//這里是你的邏輯
    }),
        TStatId(),
        nullptr,
        ENamedThreads::GameThread
        );
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

曲松县| 安国市| 喀喇| 黄骅市| 台南县| 三穗县| 濮阳县| 镇原县| 石首市| 石泉县| 诸暨市| 扶绥县| 和田县| 芷江| 通州市| 拉萨市| 永年县| 宜城市| 麻城市| 宜黄县| 石阡县| 林周县| 平南县| 习水县| 太康县| 慈溪市| 梅河口市| 利津县| 溧水县| 明星| 城固县| 胶南市| 承德县| 张家界市| 安陆市| 阿拉尔市| 团风县| 顺平县| 九江县| 云南省| 永寿县|