欢迎您光临本站,秉承服务宗旨,履行"站长"责任,销售只是起点,服务永无止境!
也想出现在这里? 联系我们

用于获取 JSON 数据的异步蓝图节点

作者 : qwe789 本文共3561个字,预计阅读时间需要9分钟 发布时间: 2023-01-31 共1.02K人阅读

我很好奇从网络服务中获取数据以在游戏中显示是多么容易。最初的用例是一个简单的每日消息(MOTD),显示在主菜单中。允许在游戏测试或(服务)问题期间与玩家轻松沟通。您也可以使用此类 Web 接口发布游戏内反馈,或者您希望保留在游戏可执行文件之外的任何数据以即时更新。

用于获取 JSON 数据的异步蓝图节点
用于获取 JSON 数据的异步蓝图节点

这个简短的教程将介绍您可以单独使用的两个主要主题。首先,如何在C++中设置异步(潜在)蓝图节点,这些节点可用于可能在多个帧上运行的任意数量的事情,例如 Web 服务(内置用例是资产的异步加载) 其次,我将展示一个简单的 HTTP 请求,用于从网页“获取”JSON 数据。

准备 JSON 数据

下面是一个最简单的格式的示例 JSON,即单个键值对。

{
   "MOTD" : "Message of the day!\nYou could insert all sorts of markup and use UMG RichTextBox for detailed formatting."
}

这应该托管在 Web 服务上的某个位置,例如“https://tomlooman.com/games/YourGame.json”。在游戏中使用相同的 URL 检索数据。

准备您的项目

在 MyProject.build 中.cs将以下模块添加:“HTTP”、“Json”到 PublicDependencyModuleNames

创建一个从UBlueprintAsyncActionBase派生的新C++类,这使我们能够轻松创建简单的潜在节点。

对于 HTTP 请求,您需要在新创建的.cpp文件中使用以下#includes:

#include "Runtime/Online/HTTP/Public/HttpModule.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"

《守则》

该节点需要几个元素才能运行,虚幻会自动将其转换为复杂节点。Activate() 函数执行请求并在请求完成后设置回调。静态函数是蓝图节点,用于实例化处理逻辑的新操作。最后,需要事件委托在蓝图节点中创建异步输出线路以及数据引脚(在下面的示例中,其 FString MOTD 和 bool bSuccess 都创建为输出数据引脚)

页眉:

// Event that will be the 'Completed' exec wire in the blueprint node along with all parameters as output pins.
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnHttpRequestCompleted, const FString&, MOTD, bool, bSuccess);

UCLASS() // Change the _API to match your project
class MYPROJECT_API ULZAsyncAction_RequestHttpMessage : public UBlueprintAsyncActionBase
{
	GENERATED_BODY()

protected:

	void HandleRequestCompleted(FString ResponseString, bool bSuccess);

public:

	/** Execute the actual load */
	virtual void Activate() override;

	UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", Category = "HTTP", WorldContext = "WorldContextObject"))
	static ULZAsyncAction_RequestHttpMessage* AsyncRequestHTTP(UObject* WorldContextObject, FString URL);

	UPROPERTY(BlueprintAssignable)
	FOnHttpRequestCompleted Completed;

	/* URL to send GET request to */
	FString URL;
};

类:

void ULZAsyncAction_RequestHttpMessage::Activate()
{
	// Create HTTP Request
	TSharedRef<IHttpRequest, ESPMode::ThreadSafe> HttpRequest = FHttpModule::Get().CreateRequest();
	HttpRequest->SetVerb("GET");
	HttpRequest->SetHeader("Content-Type", "application/json");
	HttpRequest->SetURL(URL);

	// Setup Async response
	HttpRequest->OnProcessRequestComplete().BindLambda([this](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bSuccess)
		{
			FString ResponseString = "";
			if (bSuccess)
			{
				ResponseString = Response->GetContentAsString();
			}

			this->HandleRequestCompleted(ResponseString, bSuccess);
		});

	// Handle actual request
	HttpRequest->ProcessRequest();
}


void ULZAsyncAction_RequestHttpMessage::HandleRequestCompleted(FString ResponseString, bool bSuccess)
{
	FString OutString;
	if (bSuccess)
	{
		/* Deserialize object */
		TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
		TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<>::Create(ResponseString);
		FJsonSerializer::Deserialize(JsonReader, JsonObject);

		// The simplest example parsing of the plain JSON.
		// Here you can expand to fetch your specific layout of values and objects and return
		// it via a UStruct or separate params in the Completed.Broadcast()
		if (!JsonObject->TryGetStringField("MOTD", OutString))
		{
			// While response may be successful, we failed to retrieve the string field
			bSuccess = false;
		}
	}


	Completed.Broadcast(OutString, bSuccess);
}


ULZAsyncAction_RequestHttpMessage* ULZAsyncAction_RequestHttpMessage::AsyncRequestHTTP(UObject* WorldContextObject, FString URL)
{
	// Create Action Instance for Blueprint System
	ULZAsyncAction_RequestHttpMessage* Action = NewObject<ULZAsyncAction_RequestHttpMessage>();
	Action->URL = URL;
	Action->RegisterWithGameInstance(WorldContextObject);

	return Action;
}

蓝图结果:

用于获取 JSON 数据的异步蓝图节点

关闭

就是这样!这个简短的教程有点像二合一,因为这两个概念(潜在节点和 HTTP/JSON 通信)是完全独立的,可以以许多不同的方式使用。

JSON不是虚幻引擎中默认公开的蓝图,有一些(免费)插件可用(这里和这里),可以处理我们刚刚创建的所有内容等等。

在本地化方面注意:如果要本地化 (MOTD) 文本,可以在 JSON 中为所有支持的语言提供多个密钥,并使用游戏中的活动语言提供从 JSON 中获取特定语言字符串。

版权声明:
本站所有文章、资源等一切内容,皆为在本站的注册网友所发布、上传、提供,如您发现任何内容侵犯了您的合法权益, 请与我们联系 ,我们将第一时间进行清理。iiiue.com 旨在为广大虚幻引擎爱好者提供技术交流学习、知识技术变现平台。
永久域名 iii ue .com 本站投稿能赚取收益变现提现,请一定要牢记账号密码!
Ue资源站 iiiue.com » 用于获取 JSON 数据的异步蓝图节点

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有内容皆为网友发布,资源版权均属于原作者所有,如需商用请联系原作者获取授权许可,若由于商用引起版权纠纷,一切责任均由使用者承担。如您发现某些内容侵犯了您的合法权益, 请与我们联系 ,我们将在第一时间核实并清理。
下载的资源解压密码是多少?
任何资源的解压密码均由发布者提供,一般情况下都在资源的发布页面或者资源文件夹,请仔细检查,如您发现发布页面没有提供解压密码,请您试着在评论处留言联系作者,或者复制以下两个密码进行解压,或许会有意想不到的效果。
iiiue.com
ue5club
Tips:除了密码说明内的解压密码外,通常情况下,电脑在安装好RAR或360解压缩软件,双击打开压缩包,包内注释的网址也可以试试是否为解压密码哦
资源能否免费获取
本站用户可参与站内的一系列活动获取积分,资源皆可免费获取,若想快速获取可加入本站永久VIP钻石会员,荣耀身份,全站资源免费获取, 点此查看详情

发表回复

也想出现在这里? 联系我们
开通终身VIP 永久VIP折扣活动火热进行中,享全站资源免费下载特权!