91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

【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

贵阳市| 特克斯县| 鲜城| 隆化县| 繁峙县| 台中县| 元氏县| 彭阳县| 垣曲县| 武汉市| 尚志市| 加查县| 鞍山市| 黑水县| 镇宁| 上虞市| 会理县| 渭源县| 阿瓦提县| 读书| 吴江市| 沁水县| 辽宁省| 定襄县| 明水县| 安义县| 吉安市| 德安县| 大石桥市| 临西县| 和静县| 阜平县| 兴业县| 赤壁市| 新河县| 镇坪县| 五常市| 临沧市| 仙游县| 宜宾市| 龙井市|