UE4联网检查,C++封装好,蓝图调用(不要的命名空间可以删除掉,下面代码没删)
思路:给网站发送一个http请求,看是否能访问成功,成功后传入一个bool参数到蓝图中,再在蓝图中保存结果到一个bool变量,给蓝图使用。
//.h文件
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "BFL_CommonFunction.generated.h"
UCLASS()
class ZOMBIE_API UBFL_CommonFunction : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = "FarCheckNet")
static void FarCheckNet();
};
//.cpp文件
#include "BFL_CommonFunction.h"
#include "A_GameController.h"
#include "kismet/GameplayStatics.h"
#include "BFL_FileControl.h"
//检查是否联网
#include "Http.h"
//检查是否联网
void UBFL_CommonFunction::FarCheckNet()
{
bool bSuccess = false;//请求结果
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest();
HttpRequest->SetURL("http://www.baidu.com");//后续同时访问国内一个网站 再访问国外一个,任意一个成功则有网,全不成功无网
HttpRequest->SetVerb("GET");
//绑定一个Lambda表达式,当请求结果成功或失败后 执行
HttpRequest->OnProcessRequestComplete().BindLambda([&bSuccess](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bHttpRequestSuccess) {
if (bHttpRequestSuccess && Response.IsValid())
{
int32 StatusCode = Response->GetResponseCode();
if (StatusCode == 200)//访问网站成功
{
bSuccess = true;
AA_GameController::SetNetConnectStat(bSuccess);//直接通过类调用静态函数
}
else
{
//UE_LOG(LogTemp, Warning, TEXT("Failed to access the website. Status code: %d"), StatusCode);
AA_GameController::SetNetConnectStat(false);//直接通过类调用静态函数
}
}
else
{
//UE_LOG(LogTemp, Warning, TEXT("Failed to send HTTP request."));
AA_GameController::SetNetConnectStat(false);//直接通过类调用静态函数
}
});
HttpRequest->ProcessRequest();//异步请求
float StartTime = FPlatformTime::Seconds();
while (!bSuccess)//不成功则每隔0.01f检查一次是否请求完成
{
float CurrentTime = FPlatformTime::Seconds();
if (CurrentTime - StartTime > 2.0f) // 设置最大的等待时间为 2 秒 超过2s算超时,超时算没网络
{
AA_GameController::SetNetConnectStat(false);//直接通过类调用静态函数
break;
}
FPlatformProcess::Sleep(0.01f);
}
}
蓝图中调用
蓝图中的SetNetConnectStat函数,通过传入的bool参数,对蓝图中的变量进行设置,后续蓝图中就使用设置好的变量即可。