用于获取 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 中获取特定语言字符串。
本站所有文章、资源等一切内容,皆为在本站的注册网友所发布、上传、提供,如您发现任何内容侵犯了您的合法权益,请携版权等相关证明致信vamwxyz@gmail.com 与我们联系 ,我们将第一时间进行处理。本站周1-周5每日稳定更新优质资源20+,开通永久SVIP全站资源永久免费!
本站防失联地址,请务必收藏:VAMW.XYZ
VAM » 用于获取 JSON 数据的异步蓝图节点
常见问题FAQ
- 关于解压密码和游戏资源使用方式的简要说明
- 本站默认解压密码为发布页网址:vamw.xyz 注意是小写,如果有其他密码也都在资源页面详细说明了,请认真查看,任何资源请下载后解压、切勿在线解压!VAM场景和人物形象资源下载解压缩后,放到VAM游戏目录里的AddonPackages文件夹后重启游戏即可,如D:\VAM\vam1.22.0.3\AddonPackages;更多教程请点击打开
- 海外用户怎么支付怎么下载?How can overseas users make payments and download?
- 本站支持“支付宝”、“微信”、“paypal”方式支付,如需“paypal”支付,请点击链接 https://paypal.me/vamwxyz;本站所有资源存储于“百度云网盘”,海外用户亦可通过本站教程下载安装注册“百度云网盘”进行资源的下载使用,点击查看教程
Our website supports payments via "Alipay", "WeChat" and "PayPal". If you want to pay with "PayPal", please click here https://paypal.me/vamwxyz;. All the resources on our website are stored in "Baidu Cloud Disk". Overseas users can also download, install and register "Baidu Cloud Disk" according to the tutorials on our website to download and use the resources. Click here to view the tutorials
- 怎么推广赚钱,怎么免费加入VIP?
- 高佣金活动进行中:本站开启用户推广赚钱模式,所有用户可以通过文章页或个人中心的的推广链接进行推广赚钱,普通用户推广佣金为15%;永久VIP推广佣金为30%,所有通过你的推广链接注册的用户,在后续发生的所有消费或充值会员的行为,您都有佣金拿!满50可申请提现!普通用户可以在金额达到充值会员金额的时候申请加入会员!赶快行动吧! 点此查看详情