用于获取 JSON 数据的异步蓝图节点
我很好奇从网络服务中获取数据以在游戏中显示是多么容易。最初的用例是一个简单的每日消息(MOTD),显示在主菜单中。允许在游戏测试或(服务)问题期间与玩家轻松沟通。您也可以使用此类 Web 接口发布游戏内反馈,或者您希望保留在游戏可执行文件之外的任何数据以即时更新。
这个简短的教程将介绍您可以单独使用的两个主要主题。首先,如何在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;
}
蓝图结果:
关闭
就是这样!这个简短的教程有点像二合一,因为这两个概念(潜在节点和 HTTP/JSON 通信)是完全独立的,可以以许多不同的方式使用。
JSON不是虚幻引擎中默认公开的蓝图,有一些(免费)插件可用(这里和这里),可以处理我们刚刚创建的所有内容等等。
在本地化方面注意:如果要本地化 (MOTD) 文本,可以在 JSON 中为所有支持的语言提供多个密钥,并使用游戏中的活动语言提供从 JSON 中获取特定语言字符串。
本站所有文章、资源等一切内容,皆为在本站的注册网友所发布、上传、提供,如您发现任何内容侵犯了您的合法权益, 请与我们联系 ,我们将第一时间进行清理。iiiue.com 旨在为广大虚幻引擎爱好者提供技术交流学习、知识技术变现平台。
永久域名 iii ue .com 本站投稿能赚取收益变现提现,请一定要牢记账号密码!
Ue资源站 iiiue.com » 用于获取 JSON 数据的异步蓝图节点
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有内容皆为网友发布,资源版权均属于原作者所有,如需商用请联系原作者获取授权许可,若由于商用引起版权纠纷,一切责任均由使用者承担。如您发现某些内容侵犯了您的合法权益, 请与我们联系 ,我们将在第一时间核实并清理。
- 下载的资源解压密码是多少?
- 任何资源的解压密码均由发布者提供,一般情况下都在资源的发布页面或者资源文件夹,请仔细检查,如您发现发布页面没有提供解压密码,请您试着在评论处留言联系作者,或者复制以下两个密码进行解压,或许会有意想不到的效果。
iiiue.com
ue5club
Tips:除了密码说明内的解压密码外,通常情况下,电脑在安装好RAR或360解压缩软件,双击打开压缩包,包内注释的网址也可以试试是否为解压密码哦
- 资源能否免费获取
- 本站用户可参与站内的一系列活动获取积分,资源皆可免费获取,若想快速获取可加入本站永久VIP钻石会员,荣耀身份,全站资源免费获取, 点此查看详情