1. 程式人生 > 其它 >UEC++ 會話暴露給藍圖 ,無法識別會話相關型別

UEC++ 會話暴露給藍圖 ,無法識別會話相關型別

在實在聯網功能時,我們常常需要獲取到會話型別,當我們需要在藍圖中使用這些型別的時候。如果我們直接在標頭檔案中直接使用會話相關型別在編譯時就會報錯

Unrecognized type “你所引用的類” - type must be a UCLASS,USTRUCT or UENUM

這時候就需要利用結構體對需要使用的會話型別進行一個包裝,具體的實現方式我們可以借鑑(對,是借鑑不是抄) BlueprintSession 的實現形式。找到相關標頭檔案 

\引擎安裝路徑\Engine\Plugins\Online\OnlineSubsystemUtils\Source\OnlineSubsystemUtils\Classes\FindSessionsCallbackProxy.h
\引擎安裝路徑\Engine\Plugins\Online\OnlineSubsystemUtils\Source\OnlineSubsystemUtils\Private\FindSessionsCallbackProxy.cpp

 這裡只他們的展示部分程式碼,具體可以自己去找這兩個檔案看

FindSessionsCallbackProxy.h 相關型別的封裝
USTRUCT(BlueprintType)
struct FBlueprintSessionResult
{
    GENERATED_USTRUCT_BODY()

    FOnlineSessionSearchResult OnlineResult;
};

綜上,我們就可以得出我們需要的程式碼

USTRUCT(BlueprintType)
struct FSearchResultSession {
    GENERATED_USTRUCT_BODY()
    FOnlineSessionSearchResult OnlineResult; // 注意此處不要新增UPROPERTY 不然又得找不到了
};
// 以下為型別實現,注意在結構體內是無法使用 UFUNCTION 的
UFUNCTION(BlueprintPure) static int32 GetPingInMs(const FSearchResultSession& ResultSession) {
return ResultSession.OnlineResult.PingInMs; } UFUNCTION(BlueprintPure) static FString GetServerName(const FSearchResultSession& ResultSession) { return ResultSession.OnlineResult.Session.OwningUserName; } UFUNCTION(BlueprintPure) static int32 GetCurrentPlayer(const FSearchResultSession& ResultSession) { return ResultSession.OnlineResult.Session.SessionSettings.NumPublicConnections - ResultSession.OnlineResult.Session.NumOpenPublicConnections; } UFUNCTION(BlueprintPure) static int32 GetMaxPlayer(const FSearchResultSession& ResultSession) { return ResultSession.OnlineResult.Session.SessionSettings.NumPublicConnections; }

需要其他什麼功能可以另行新增,注意函式的形參型別是自己定義的結構體名稱

試一試~ emmmmm 非常~好用!