首页 > 其他分享 >[22] 虚幻引擎知识拓展 智能指针、JSON解析、插件

[22] 虚幻引擎知识拓展 智能指针、JSON解析、插件

时间:2024-06-03 21:55:39浏览次数:14  
标签:插件 22 pMyClass LOG TEXT JSON JsonObject UE Log

Day1

大纲

虚幻智能指针

  共享指针

  共享引用

JSON解析 对象型、数组型、解析Json文件、书写Json、读取场景Actor保存到Json

任务 : 封装高德地图天气系统插件给蓝图使用

内容

虚幻智能指针

创建共享指针

// //创建共享指针
//TSharedPtr<FMyClass> pMyClass = MakeShareable(new FMyClass);
TSharedPtr<FMyClass> pMyClass(new FMyClass);
//检查有效性
if (pMyClass)
{
}
TSharedPtr<FMyClass> p2;

//比较
if (pMyClass == p2)
{
}
//获取引用计数(当前共享指针管理的内存有多少人在用)
UE_LOG(LogTemp, Log, TEXT("%d"), pMyClass.GetSharedReferenceCount());
p2 = pMyClass;
UE_LOG(LogTemp, Log, TEXT(" == %d"), pMyClass.GetSharedReferenceCount());
//释放
pMyClass = nullptr;
UE_LOG(LogTemp, Log, TEXT(" == %d"), p2.GetSharedReferenceCount());

共享引用

// //创建共享指针
//TSharedPtr<FMyClass> pMyClass = MakeShareable(new FMyClass);
TSharedPtr<FMyClass> pMyClass(new FMyClass);
//检查有效性
if (pMyClass)
{
}
TSharedPtr<FMyClass> p2;

//比较
if (pMyClass == p2)
{
}
//获取引用计数(当前共享指针管理的内存有多少人在用)
UE_LOG(LogTemp, Log, TEXT("%d"), pMyClass.GetSharedReferenceCount());
p2 = pMyClass;
UE_LOG(LogTemp, Log, TEXT(" == %d"), pMyClass.GetSharedReferenceCount());
//释放
pMyClass = nullptr;
UE_LOG(LogTemp, Log, TEXT(" == %d"), p2.GetSharedReferenceCount());

弱指针

// //创建共享指针
//TSharedPtr<FMyClass> pMyClass = MakeShareable(new FMyClass);
TSharedPtr<FMyClass> pMyClass(new FMyClass);
//检查有效性
if (pMyClass)
{
}
TSharedPtr<FMyClass> p2;

//比较
if (pMyClass == p2)
{
}
//获取引用计数(当前共享指针管理的内存有多少人在用)
UE_LOG(LogTemp, Log, TEXT("%d"), pMyClass.GetSharedReferenceCount());
p2 = pMyClass;
UE_LOG(LogTemp, Log, TEXT(" == %d"), pMyClass.GetSharedReferenceCount());
//释放
pMyClass = nullptr;
UE_LOG(LogTemp, Log, TEXT(" == %d"), p2.GetSharedReferenceCount());

循环引用 : 智能指针引用计数为0才会释放

弱指针

 

 

JSON解析

对象型JSON

//解析对象型JSON
FString JsonStr = TEXT("{\"name\":\"二狗\", \"age\" : 39}");
//创建接收Json对象的数据
TSharedPtr<FJsonObject> JsonObject;
//借助解析工厂,解析Json文本串到阅读器
TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(JsonStr);
//借助解析器,完成解析
//反向序列化:从其它格式数据到内存对象格式数据
if (FJsonSerializer::Deserialize(JsonReader, JsonObject))
{
	//读取数据?
	UE_LOG(LogTemp, Log, TEXT("%s"), *JsonObject->GetStringField(TEXT("name")));
	//检查是否存在某个字段
	float age = 0;
	if (JsonObject->TryGetNumberField(TEXT("age"), age))
	{
		UE_LOG(LogTemp, Log, TEXT("== %f"), age);
	}
}

数组型JSON

//数组型JSon
FString JsonStr =TEXT("[\"二狗\", 34, true, {\"name\":\"二狗\", \"age\" : 39}, [49]]");

TArray<TSharedPtr<FJsonValue>> JsonValues;

TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(JsonStr);

if (FJsonSerializer::Deserialize(JsonReader, JsonValues))
{
    //读取元素
    UE_LOG(LogTemp, Log, TEXT("%s"), *JsonValues[0]->AsString());
    //
    float Num = 0;
    if (JsonValues[1]->TryGetNumber(Num))
    {
       UE_LOG(LogTemp, Log, TEXT("%f"), Num);
    }
    TSharedPtr<FJsonObject> JsonObject = JsonValues[3]->AsObject();
    UE_LOG(LogTemp, Log, TEXT("%s"), *JsonObject->GetStringField(TEXT("name")));
    //解析数组
    UE_LOG(LogTemp, Log, TEXT("%f"), JsonValues[4]->AsArray()[0]->AsNumber());
}

从磁盘解析JSON

//从磁盘解析json
FString JsonStr;

if (FFileHelper::LoadFileToString(JsonStr, TEXT("d:\\a.json")))
{
	TSharedPtr<FJsonObject> JsonObject;
	TSharedRef<TJsonReader<>> JsonReader = TJsonReaderFactory<>::Create(JsonStr);
	if (FJsonSerializer::Deserialize(JsonReader, JsonObject))
	{
		TArray<TSharedPtr<FJsonValue>> person = JsonObject->GetArrayField(TEXT("person"));
		TArray<TSharedPtr<FJsonValue>> teachers = person[0]->AsObject()->GetArrayField(TEXT("teachers"));
		TSharedPtr<FJsonObject> liu = teachers[1]->AsObject()->GetObjectField(TEXT("liu"));
		TArray<TSharedPtr<FJsonValue>> hobby = liu->GetArrayField(TEXT("hobby"));
		for (auto hb : hobby)
		{
			UE_LOG(LogTemp, Log, TEXT("%s"), *hb->AsString());
		}
	}
}

序列化Json 对象型

//序列化json 对象型
TSharedPtr<FJsonObject> JsonObject(new FJsonObject);
//设置字段
JsonObject->SetStringField(TEXT("name"), TEXT("二狗"));
JsonObject->SetNumberField(TEXT("age"), 40);
//构建书写器
FString JsonStr;
TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonStr);
//序列化
if (FJsonSerializer::Serialize(JsonObject.ToSharedRef(), JsonWriter))
{
    UE_LOG(LogTemp, Log, TEXT("%s"), *JsonStr);
}

序列化Json 数组型

//数组型
TArray<TSharedPtr<FJsonValue>> JsonValues;

JsonValues.Add(MakeShareable(new FJsonValueString(TEXT("二狗"))));
JsonValues.Add(MakeShareable(new FJsonValueNumber(49)));
JsonValues.Add(MakeShareable(new FJsonValueBoolean(true)));

FString JsonStr;
TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonStr);
if (FJsonSerializer::Serialize(JsonValues, JsonWriter))
{
	UE_LOG(LogTemp, Log, TEXT("%s"), *JsonStr);
}

案例 : 读取场景中的Actor的坐标、缩放、旋转保存到JSON文件

TArray<TSharedPtr<FJsonValue>> JsonValues;

TArray<AActor*> Actors;
//获取场景所有Actor
UGameplayStatics::GetAllActorsOfClass(this, AActor::StaticClass(), Actors);

for (auto ac : Actors)
{
    //新建一个对象型 Json
    TSharedPtr<FJsonObject> JsonObject(new FJsonObject);
    JsonObject->SetStringField(TEXT("Name"), ac->GetName());

    TSharedPtr<FJsonObject> Position(new FJsonObject);
    Position->SetNumberField(TEXT("X"), ac->GetActorLocation().X);
    Position->SetNumberField(TEXT("Y"), ac->GetActorLocation().Y);
    Position->SetNumberField(TEXT("Z"), ac->GetActorLocation().Z);
    JsonObject->SetObjectField(TEXT("Position"), Position);

    TSharedPtr<FJsonObject> Rotation(new FJsonObject);
    Rotation->SetNumberField(TEXT("Pitch"), ac->GetActorRotation().Pitch);
    Rotation->SetNumberField(TEXT("Yaw"), ac->GetActorRotation().Yaw);
    Rotation->SetNumberField(TEXT("Roll"), ac->GetActorRotation().Roll);
    JsonObject->SetObjectField(TEXT("Rotation"), Rotation);

    TSharedPtr<FJsonObject> Scale(new FJsonObject);
    Scale->SetNumberField(TEXT("X"), ac->GetActorScale().X);
    Scale->SetNumberField(TEXT("Y"), ac->GetActorScale().Y);
    Scale->SetNumberField(TEXT("Z"), ac->GetActorScale().Z);
    JsonObject->SetObjectField(TEXT("Scale"), Scale);

    JsonValues.Add(MakeShareable(new FJsonValueObject(JsonObject)));
}

FString JsonStr;
TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonStr);

if (FJsonSerializer::Serialize(JsonValues, JsonWriter))
{
    FFileHelper::SaveStringToFile(JsonStr, TEXT("d:\\b.json"));//保存到文件
}

插件

蓝图无法直接操作C++的东西 , 使用C++包裹一层在蓝图里面调用

纯标记 : 每次调用都会执行一次引脚

侵入式指针



 

 

 

API & 节点

TIPS

面试 : 循环引用

Json和虚幻数组的区别 , 不是同质类型

多思考这个游戏我来做这个功能怎么做

时间膨胀值 : 局部和全局
时空穿梭 : 

疑问

标签:插件,22,pMyClass,LOG,TEXT,JSON,JsonObject,UE,Log
From: https://www.cnblogs.com/Aquakinn/p/18229394

相关文章

  • Error: Failure while executing; mpdecimal-2.5.1.catalina.bottle.tar.gz` exited w
    ==>Installingdependenciesfornode:mpdecimal,ca-certificates,[email protected],readline,sqlite,xz,[email protected],brotli,cmake,c-ares,icu4c,libnghttp2andlibuv==>Installingnodedependency:mpdecimalError:Failurewhileexecuting;`/usr/bin/......
  • 使用 Helmfile 插件进行 Argo CD 部署 - 未找到卷挂载
    我正试图在我的Rancherkubernetes集群中使用Helmfile插件设置ArgoCD部署,并遵循此参考文档。但是,我遇到了找不到卷挂载的问题。以下是我的设置细节:<代码Deployment.yaml:apiVersion:apps/v1类型:部署元数据:名称:argocd-repo-server命名空间:argocdspec:tem......
  • 2024-6-3 石群电路-22
    2024-6-3,星期一,20:45,天气:晴,心情:阴转晴。今天没有发生了一些令人不开心事情,心情有些差,不过还是调整过来了,活好自己,就是对你讨厌的人最大的惩罚。因为准备毕业论文答辩的材料所以更新的晚了一点。今日观看了石群老师电路课程的第38个视频,开始了第九章的学习,主要学习内容为:阻抗的......
  • 【计算机毕业设计】ssm722花卉库存管理系统+vue
    如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统花卉库存信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个花卉库存管理系统,可......
  • Notepad++文件内容对比插件
    遇到一个比较有意思的测试任务,上报日志功能接口路由需要更换V2版本,需要测试对比V1和V2版本上报的数据有没有异常点思路很简单,使用相同的数据遍历调用V1和V2版本的接口路由,取出最后的日志接口对比即可Notepad++插件compare安装插件--插件管理--搜素compare安装即可(安装插件后程......
  • 安装jsonpath时报错: ERROR: Could not find a version that satisfies the requireme
    安装jsonpath时报错:ERROR:Couldnotfindaversionthatsatisfiestherequirementjsonpath(fromversions:none)ERROR:Nomatchingdistributionfoundforjsonpath解决方法:pipinstalljsonpath-i http://mirrors.aliyun.com/pypi/simple/--trusted-hostmirrors.......
  • fastjson反序列化漏洞
    一题Think_java大多数师傅都是用的自己构造的java反序列化来做的。正好当时用fastjson写出来了。近些天也在挖洞,对于很多json传输的数据也会尝试一下fastjson的payload。那就正好一起来看当时如何利用fastjson的,应该是个非预期吧,其实这个虽然说是ctf题目,但环境属实和实战没......
  • javaScript基础22
    一、概念一门客户端脚本语言运行在客户端浏览器中的。每一个浏览器都有JavaScript的解析引擎脚本语言:不需要编译,直接就可以被浏览器解析执行了二、功能可以来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验。三、JavaScript发......
  • KRPano插件一键解密大师1.4.0更新
    KRPano插件一键解密大师,可以一键解密KRPano的XML/JS插件,并可以分析下载静态和动态网站的所有资源。软件下载安装即可使用,解密仅需鼠标一键点击即可,无需配置任何开发环境,方便全景开发人员研究学习全景开发,了解KRPano插件运行原理等。  1.4.0版本更新 1.修复某些网址无法......
  • P8779 [蓝桥杯 2022 省 A] 推导部分和
    原题链接题解1.集合+搜索2.把数字看成间隔而不是点3.类似于差分约束,这里的建边意味着相对大小,根据传递性可知,如果ab建边,bc建边,那么ac之间的关系也能确定,可以用搜索维护所以unknown代表两个点没有之间或者间接的边相连,可以用集合维护code#include<bits/stdc++.h>#definel......