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 非常~好用!

 

posted @ 2022-12-06 15:02  黎沐不吃香菜  阅读(927)  评论(0)    收藏  举报