UE5.3 C++ USTRUCT的规范使用和制作简单的画线插件

一.创造一个USTRUCT

1.首先需要创建一个,None。

#include "LineDataStruct.generated.h"

FTPAData里加入GENERATED_USTRUCT_BODY();

 //Topic=DDS_TPA_Data, 预测航迹线,单次事件
USTRUCT()
struct FTPAData
{GENERATED_USTRUCT_BODY();int16 header;                              // 包头int16 flag;                                // 标志位int64 timestamp;                           // 时间戳int16 validPointCount;                     // 轨迹有效点数  最大值1000,轨迹有效点数为N1时读取N1个轨迹点数据int16 reserved1;                           // 预留接口1int16 reserved2;                           // 预留接口2int16 reserved3;                           // 预留接口3int32 reserved4;                           // 预留接口4int32 reserved5;                           // 预留接口5FTPAData_Point TPAData_Point[1000];	// 轨迹点数组int16 checksum;                            // 校验值
};#pragma pack()

如果想让蓝图认识,需要加BlueprintType。如果想让变量能在蓝图中访问,可用Break/Make,需要使用UPROPERTY修饰符(BlueprintReadWrite)。

二.画线插件

不多废话,直接上代码

UCLASS()
class HMSLINESYSTEM_API UDrawLineSubsystem : public UGameInstanceSubsystem
{GENERATED_BODY()
public:void UpdateLinePath(int id,FVector First,FVector Second);//void UpdateLinePath2(int id,FVector First, FVector Second);//void LinePatch(FVector Fi);
private:void InitialGeoreference();
public:
private:ACesiumGeoreference* Georeference;//航迹线,航迹线idTMap<int8, ASplineActor*> LinePathMap;TMap<int8, ALinePatchActor*> LinePatchPathMap;UMaterialParameterCollectionInstance* M_ParamCollection;int num = 100.f;};

先介绍,这种简单一点的通过,UE自带的LinePatchComponent进行画线,给一头一尾就能画。将Cesium的点换为UE坐标系的点,再去画。

//void UpdateLinePath2(int id,FVector First, FVector Second);
void UDrawLineSubsystem::UpdateLinePath2(int id, FVector First, FVector Second)
{int32 tmpPathID = id;if (LinePatchPathMap.Find(tmpPathID)){if (!Georeference)InitialGeoreference();if (!Georeference) return;if (!First.IsZero()){//处理点位信息FVector tmpDataPosition = FVector(First);FVector FirstUELocation = Georeference->TransformLongitudeLatitudeHeightPositionToUnreal(tmpDataPosition);LinePatchPathMap[tmpPathID]->SetActorLocation(FirstUELocation);First = FirstUELocation;}if (!Second.IsZero()){//处理点位信息FVector tmpDataPosition = FVector(Second);FVector SecondUELocation = Georeference->TransformLongitudeLatitudeHeightPositionToUnreal(tmpDataPosition);Second = SecondUELocation;}LinePatchPathMap[tmpPathID]->CreateLine(First, Second);//M_ParamCollection->SetScalarParameterValue(FName("CollisionHeightLow"), CollisionRender.HightLow * 100.f);}else{ALinePatchActor* LinePatchActor = GetWorld()->SpawnActor<ALinePatchActor>();if (!LinePatchActor){UE_LOG(LogTemp, Error, TEXT("failed to spawn LinePathActor! UDrawLineSubsystem::UpdateLinePath2"));return;}else{LinePatchPathMap.Add(tmpPathID, LinePatchActor);}}
}

这个是画线的,把头和组件加上就行了。

#include "Components/LineBatchComponent.h"
// Sets default values
ALinePatchActor::ALinePatchActor()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;SetRootComponent(CreateDefaultSubobject<USceneComponent>(TEXT("DefaultSceneRoot")));LineBatchComponent = CreateDefaultSubobject<ULineBatchComponent>(TEXT("LineBatchComponent"));LineBatchComponent->SetupAttachment(RootComponent);
}
void ALinePatchActor::CreateLine(FVector First, FVector Second)
{LineBatchComponent->Flush();LineBatchComponent->DrawLine(First, Second, FColor::Purple, 1.f, 50.f, 0); // Adjust the colors and thickness as needed
}

用UGameInstanceSubsystem做插件的好处,有很多。自己能管理生命周期,获取方便。

把模块和头加上就能从GameInstance里获得GameSubsystem,再转换为自己的system。

UDrawLineSubsystem* LineSystem = GetWorld()->GetGameInstance()->GetSubsystem<UDrawLineSubsystem>();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析 STM32 GPIO:结构、配置与应用实践

理解 GPIO 的工作原理和配置方法是掌握 STM32 开发的基础&#xff0c;后续的外设&#xff08;如定时器、ADC、通信接口&#xff09;都依赖于 GPIO 的正确配置。 目录 一、GPIO 的基本概念 二、GPIO 的主要功能 三、GPIO 的内部结构 四、GPIO 的工作模式 1. 输入模式 2. 输…

使用DeepSeek建立一个智能聊天机器人0.1

我对代码进行进一步的完善&#xff0c;增加更多的节点连接及功能运用&#xff0c;并确保配置文件 config.json 的内容更加丰富和详细。以下是完善后的代码和 config.json 文件内容。 完善后的代码 import tkinter as tk from tkinter import scrolledtext, filedialog, messa…

【人工智能】人工智能学习基础知识汇总

第1章初识人工智能 本章主要介绍人工智能的概念、诞生和发展历程。具体包括人工智能概念的提出和涉及 的相关重要人物,以及人工智能发展过程中的几个阶段,包括诞生、两次浪潮与寒冬、稳健 阶段和ABC 新时代。 本章的主要知识点如下: 人工智能概念 1. 人工智能英文名为“…

Promise的三种状态

目录 代码示例 HTML JavaScript 代码&#xff1a; 代码解释 总结 在 JavaScript 中&#xff0c;Promise 是一种异步编程的解决方案&#xff0c;它用于表示异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。Promise 主要有三种状态&#xff1a; Pending&#…

排序之选择排序(C# C++)

目录 1 选择排序 2 排序原理 3 排序步骤 4 代码示例 4-1 C#代码示例 4-2 C代码示例 1 选择排序 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是每一轮从待排序的数据元素中选出最小&#xff08;或最大&#xff09…

达梦 跟踪日志诊断

目录标题 参考连接**性能诊断&#xff1a;跟踪日志诊断****总结** 参考连接 性能诊断 -> 跟踪日志诊断 性能诊断&#xff1a;跟踪日志诊断 备份现有的日志配置文件 在修改文件之前&#xff0c;建议先备份原始文件&#xff0c;以防万一需要恢复。 cp /opt/dmdbms/dmdata/DA…

nodejs版本管理,使用 nvm 删除node版本,要删除 Node.js 的某个版本详细操作

要删除 Node.js 的某个版本并保持 Node Version Manager (nvm) 的管理整洁&#xff0c;可以按以下步骤操作&#xff1a; 步骤 1&#xff1a;查看已安装的 Node.js 版本 nvm ls这会列出你通过 nvm 安装的所有 Node.js 版本。输出类似于&#xff1a; -> v18.17.1v16.20…

算法与数据结构(多数元素)

题目 思路 方法一&#xff1a;哈希表 因为要求出现次数最多的元素&#xff0c;所以我们可以使用哈希映射存储每个元素及其出现的次数。每次记录出现的次数若比最大次数大&#xff0c;则替换。 方法二&#xff1a;摩尔算法 摩尔的核心算法就是对抗&#xff0c;因为存在次数多…

《open3d qt 网格采样成点云》

open3d qt 网格采样成点云 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionMeshUniformSample_triggered();//均匀采样 void MainWindow::

windows平台上 oracle简单操作手册

一 环境描述 Oracle 11g单机环境 二 基本操作 2.1 数据库的启动与停止 启动: C:\Users\Administrator>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 星期五 7月 31 12:19:51 2020 Copyright (c) 1982, 2013, Oracle. All rights reserved. 连接到:…

mybatis mapper java.uti.Date 与 jdbcType.TIMESTAMP相差8小时

Java实体类 给类型是 Date mybatis中配置的 jdbcType“TIMESTAMP” 最后通过mapper查询出的数据&#xff0c;比数据库中一直少8个小时。网上查询以及深度学习 问答系统&#xff0c;都说是时区问题导致的。 检查了数据库连接字符串 已经添加了 asia/shanghai 采用select sysdat…

【SpringBoot3.x+】slf4j-log4j12依赖引入打印日志报错的两种解决方法

最开始引入了1.7.5版本的slf4j-log4j依赖包&#xff0c;但是控制台不报错也不显示日志 在https://mvnrepository.com/找到最新的2.0.16版本之后出现报错&#xff1a; 进入提示的slf4j网站中可以找到从2.0.0版本开始&#xff0c;slf4j-log4j已经被slf4j-reload4j取代&#xff1…

C语言交换排序之快速排序

文章目录 概要代码输出分析优缺点 概要 快速排序&#xff08;Quick Sort&#xff09;&#xff1a; 是一种非常高效的排序算法&#xff0c;基于分治法&#xff08;Divide and Conquer&#xff09;的思想。它的基本思想是通过一个"基准"元素&#xff08;pivot&#xf…

SpringMVC请求执行流程源码解析

文章目录 0.SpringMVC九大内置组件1.processRequest方法1.请求先到service方法2.然后不管是get还是post都会跳转到processRequest方法统一处理 2.doService方法3.doDispatch方法1.代码2.checkMultipart 4.核心流程 0.SpringMVC九大内置组件 1.processRequest方法 1.请求先到se…

深度学习项目--基于RNN的阿尔茨海默病诊断研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 其实这个项目比较适合机器学习做&#xff0c;用XGBoost会更好&#xff0c;这个项目更适合RNN学习案例&#xff0c;测试集准确率达到百分之84.2&#xf…

华宇TAS应用中间件与因朵科技多款产品完成兼容互认证

在数字化浪潮澎湃向前的当下&#xff0c;信息技术的深度融合与协同发展成为推动各行业创新变革的关键力量。近日&#xff0c;华宇TAS应用中间件携手河北因朵科技有限公司&#xff0c;完成了多项核心产品的兼容互认证。 此次兼容性测试的良好表现&#xff0c;为双方的进一步深入…

麒麟操作系统-MySQL5.7.36二进制安装

1、创建MySQL虚拟用户 groupadd mysql useradd -g mysql -s /sbin/nologin -M mysql 2、创建目录 mkdir -p /data/file #创建文件目录 mkdir -p /opt/mysql #创建MySQL安装目录 mkdir -p /data/mysql/mysql3306/{data,logs} #创建MySQL数据及日志目录 3、安装MySQL5.7.36 …

算法学习笔记之贪心算法

导引&#xff08;硕鼠的交易&#xff09; 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间&#xff0c;第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换&#xff0c;硕鼠可以按比例来交换&#xff0c;不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…

Xcode证书密钥导入

证书干嘛用 渠道定期会给xcode证书&#xff0c;用来给ios打包用&#xff0c;证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中&#xff0c;选择系统。(选登录也行&#xff0c;反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥&#xff…

使用 Elastic APM 监控你的 C++ 应用程序

作者&#xff1a;来自 Elastic Haidar Braimaanie 在本文中&#xff0c;我们将使用 Opentelemetry CPP 客户端来监控 Elastic APM 中的 C 应用程序。 介绍 开发人员、SRE 和 DevOps 专业人员面临的主要挑战之一是缺乏能够为他们提供应用程序堆栈可见性的综合工具。市场上的许多…