UE5 C++ 通过绑定编辑器事件实现控制柄顶点编辑

开发中经常会遇到编辑器环境中制作工具拖拽控制柄编辑内容的需求,此时可以通过Editor事件拿到对应回调,进行相应更新:
在这里插入图片描述

1.创建Mesh编辑Actor类

创建一个Mesh编辑Actor类,提供Mesh顶点编辑的相关逻辑。

.h:

#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ProceduralMeshComponent.h"
#include "DraggableHandleActor.h"
#include "CustomMeshActor.generated.h"UCLASS()
class MYPROJECT6_API ACustomMeshActor : public AActor
{GENERATED_BODY()public:	ACustomMeshActor();UPROPERTY(EditAnywhere, BlueprintReadWrite)UProceduralMeshComponent* MeshComponent;UPROPERTY(EditAnywhere, BlueprintReadWrite)ADraggableHandleActor* HandleP0;UPROPERTY(EditAnywhere, BlueprintReadWrite)ADraggableHandleActor* HandleP1;UPROPERTY(EditAnywhere, BlueprintReadWrite)ADraggableHandleActor* HandleP2;UPROPERTY(EditAnywhere, BlueprintReadWrite)ADraggableHandleActor* HandleP3;protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;void OnRebuild();UFUNCTION()void OnHandleP0Moved();UFUNCTION()void OnHandleP1Moved();UFUNCTION()void OnHandleP2Moved();UFUNCTION()void OnHandleP3Moved();
};

.cpp:

#include "CustomMeshActor.h"ACustomMeshActor::ACustomMeshActor()
{PrimaryActorTick.bCanEverTick = true;MeshComponent = CreateDefaultSubobject<UProceduralMeshComponent>(TEXT("ProceduralMesh"));RootComponent = MeshComponent;
}void ACustomMeshActor::BeginPlay()
{Super::BeginPlay();HandleP0->OnHandleMoved.AddDynamic(this, &ACustomMeshActor::OnHandleP0Moved);HandleP1->OnHandleMoved.AddDynamic(this, &ACustomMeshActor::OnHandleP1Moved);HandleP2->OnHandleMoved.AddDynamic(this, &ACustomMeshActor::OnHandleP2Moved);HandleP3->OnHandleMoved.AddDynamic(this, &ACustomMeshActor::OnHandleP3Moved);this->OnRebuild();
}void ACustomMeshActor::OnRebuild()
{TArray<FVector> Vertices;FTransform ActorTransform = GetActorTransform();Vertices.Add(HandleP0->GetActorLocation());Vertices.Add(HandleP1->GetActorLocation());Vertices.Add(HandleP2->GetActorLocation());Vertices.Add(HandleP3->GetActorLocation());TArray<int32> Triangles;Triangles.Add(0);Triangles.Add(1);Triangles.Add(2);Triangles.Add(0);Triangles.Add(2);Triangles.Add(3);// 定义 UV 坐标TArray<FVector2D> UV0;UV0.Add(FVector2D(0.0f, 0.0f));UV0.Add(FVector2D(0.0f, 1.0f));UV0.Add(FVector2D(1.0f, 1.0f));UV0.Add(FVector2D(1.0f, 0.0f));// 法线TArray<FVector> Normals;Normals.Add(FVector(0.0f, 0.0f, 1.0f));Normals.Add(FVector(0.0f, 0.0f, 1.0f));Normals.Add(FVector(0.0f, 0.0f, 1.0f));Normals.Add(FVector(0.0f, 0.0f, 1.0f));// 切线TArray<FProcMeshTangent> Tangents;Tangents.Add(FProcMeshTangent(1.0f, 0.0f, 0.0f));Tangents.Add(FProcMeshTangent(1.0f, 0.0f, 0.0f));Tangents.Add(FProcMeshTangent(1.0f, 0.0f, 0.0f));Tangents.Add(FProcMeshTangent(1.0f, 0.0f, 0.0f));TArray<FColor> VertexColors;VertexColors.Add(FLinearColor::White.ToFColor(true));VertexColors.Add(FLinearColor::White.ToFColor(true));VertexColors.Add(FLinearColor::White.ToFColor(true));VertexColors.Add(FLinearColor::White.ToFColor(true));MeshComponent->ClearAllMeshSections();MeshComponent->CreateMeshSection(0, Vertices, Triangles, Normals, UV0, VertexColors, Tangents, true);
}void ACustomMeshActor::OnHandleP0Moved()
{OnRebuild();
}void ACustomMeshActor::OnHandleP1Moved()
{OnRebuild();
}void ACustomMeshActor::OnHandleP2Moved()
{OnRebuild();
}void ACustomMeshActor::OnHandleP3Moved()
{OnRebuild();
}

这部分代码通过UE的ProceduralMeshComponent动态创建顶点和Mesh。

2.创建操作柄

第二步需要实现拖拽操作柄或者修改界面数值得到回调,从而更新Mesh,在UE中这一块的编辑器回调有如下:

virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; //UE面板修改数值
virtual void PostEditMove(bool bFinished) override; //UE界面拖拽Actor

接下来编写Actor - DraggableHandleActor来实现这样的逻辑:
.h

#pragma once#include "CoreMinimal.h"
#include "DraggableHandleActor.generated.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnHandleMoved);UCLASS()
class MYPROJECT6_API ADraggableHandleActor : public AActor
{GENERATED_BODY()public:ADraggableHandleActor();#if WITH_EDITORvirtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;virtual void PostEditMove(bool bFinished) override;
#endif// Delegate for handle moved callbackUPROPERTY(BlueprintAssignable, Category = "Handle Events")FOnHandleMoved OnHandleMoved; // Delegate for broadcasting the movement
};

.cpp:

#include "DraggableHandleActor.h"ADraggableHandleActor::ADraggableHandleActor()
{
}#if WITH_EDITORvoid ADraggableHandleActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{Super::PostEditChangeProperty(PropertyChangedEvent);OnHandleMoved.Broadcast();
}void ADraggableHandleActor::PostEditMove(bool bFinished)
{Super::PostEditMove(bFinished);OnHandleMoved.Broadcast();
}#endif

注意这里定义了一个委托来给外部绑定回调:

DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnHandleMoved);

3.UE整合

在这里插入图片描述
最后在UE中绑定控制柄对应的Actor,并放置进对应的UMG或者Editor触发代码中即可。最后再记录顶点操作位置,再在运行时还原,即可实现这样的编辑器下顶点修改编辑需求。

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

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

相关文章

Mac上强大的菜单栏管理工具

想要Mac用的好&#xff0c;各种工具少不了&#xff0c;一款好用的软件对于提高使用效率和使用舒适度来说非常必要&#xff0c;iBar-强大的菜单栏图标管理工具 随着 Mac 运行的软件增加&#xff0c;状态栏中的图标也越来越多&#xff0c;不仅看得眼花缭乱&#xff0c;而且刘海屏…

KEFK 架构实时数据处理

一、概述 在大数据和实时数据分析的领域&#xff0c;构建高效、低延迟的数据处理架构至关重要。KEFK 架构是应对这些挑战的一种现代化技术栈&#xff0c;结合了分布式消息系统、实时流处理引擎、搜索引擎和数据可视化工具。本文将从 KEFK 架构的概念、优势及其与传统数据处理架…

开发一个UniApp需要多长时间

开发一个UniApp所需的时间因项目的规模、复杂度、开发团队的经验水平以及开发过程中的需求变更等多种因素而异。因此&#xff0c;很难给出一个确切的时间范围。然而&#xff0c;我们可以从以下几个方面来大致估算开发时间&#xff1a; 项目规划与需求分析&#xff1a; 在项目开…

【网络安全】账户安全随笔

未经许可,不得转载。 作者:Enoch 原文出处:https://mp.weixin.qq.com/s/oKBpZ0F6Kl5NNmHSYCYIPw 文章目录 账户类型资金划转问题幂等ID使用错误多接口并发问题精度问题其他划转问题特殊资金盗取问题科学计数法问题账户类型 在互联网金融和电商企业中,账户安全直接关系到用…

Fetch 与 Axios:JavaScript HTTP 请求库的详细比较

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

基于SpringBoot民宿预订系统小程序【附源码】

效果如下&#xff1a; 管理员登录界面 管理员功能界面 用户管理界面 房东管理界面 小程序首页界面 民宿房间界面 功能界面 研究背景 随着旅游业的蓬勃发展和人们对旅行体验的不断追求&#xff0c;民宿作为一种独特的住宿方式&#xff0c;因其个性化、温馨及富含地方特色的服务…

机器学习中的模型设计与训练流程详解

目录 前言1. 模型设计1.1 数据特性分析1.2 计算资源限制1.3 应用场景需求 2. 模型训练2.1 训练集与验证集的划分2.2 损失函数的选择2.3 模型参数更新 3. 优化方法3.1 梯度下降法3.2 正则化方法 4. 模型测试4.1 性能评估指标4.2 模型的泛化能力 5. 模型选择5.1 数据规模与模型复…

matlab不小心删除怎么撤回

预设项——>删除文件——>移动至临时文件夹 tem临时文件夹下

鸿蒙开发之ArkUI 界面篇 三十五 容器组件Tabs 切换高亮

好多app都有切换点中的时候高亮效果&#xff0c;如下图所示&#xff1a; 改变的是什么呢&#xff1f;是字体的颜色、背景图&#xff0c;不是切换到的界面&#xff0c;又恢复到默认的图片和字体颜色&#xff0c;而鸿蒙中更新界面的值需要使用State修饰&#xff0c;Tabs提供了onC…

Linux环境通过APT 仓库安装版PostgreSQL 数据库实战

Linux环境通过APT 仓库安装版PostgreSQL 数据库是运维人员常见的需求之一&#xff0c;今天我们一步一步演示一下&#xff1a; 1、添加 PostgreSQL APT 仓库 确保你的系统更新&#xff0c;然后添加 PostgreSQL 的官方 APT 仓库。 sudo apt update sudo apt install -y wget w…

【动手学深度学习】6.4 多输入多输出通道

彩色图像具有标准的RBG通道来代表红绿蓝&#xff0c;但是到目前位置我们仅展示了单个输入和单个通道的简化例子。这使得我们可以将输入&#xff0c;卷积核和输出看作二维张量而当我们添加通道时&#xff0c;输入和隐藏表示都变成了三维张量。例如每个RGB输入图像都具有 3 h …

QD1-P5 HTML 段落标签(p)换行标签(br)

本节视频 www.bilibili.com/video/BV1n64y1U7oj?p5 ‍ 本节学习 HTML 标签&#xff1a; p标签 段落br标签 换行 ‍ 一、p 标签-段落 1.1 使用 p 标签划分段落 <p>段落文本</p>示例 <!DOCTYPE html> <html><head><meta charset"…

Windows11系统下Sentinel环境搭建教程

目录 前言Sentinel简介Sentinel下载安装Sentinel配置与启动总结 前言 本文为博主在项目环境搭建时记录的Sentinel安装流程&#xff0c;希望对大家能够有所帮助&#xff0c;不足之处欢迎批评指正&#x1f91d;&#x1f91d;&#x1f91d; Sentinel简介 github主页地址 &#x…

电脑查不到IP地址是什么原因?怎么解决

在日常使用电脑的过程中&#xff0c;有时会遇到无法查询到电脑IP地址的情况&#xff0c;这可能会影响到网络的正常使用。本文将探讨电脑查不到IP地址的可能原因&#xff0c;并提供相应的解决方案。 一、原因分析 ‌网络连接问题‌&#xff1a;首先&#xff0c;网络连接不稳定或…

中间件:SpringBoot集成Redis

一、Redis简介 Redis是一个开源的、基于内存的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。Redis支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&#xff08;lists&#xff09…

服务器数据恢复—EMC存储RAID5磁盘阵列数据恢复案例

服务器数据恢复环境&#xff1a; 一台EMC某型号存储设备&#xff0c;该存储中有一组由12块&#xff08;包括2块热备盘&#xff09;STAT硬盘组建的raid5阵列。 服务器故障&#xff1a; 该存储在运行过程中突然崩溃&#xff0c;raid瘫痪。数据恢复工程师到达现场对故障存储设备进…

点云数据与多相机图像融合实现3D场景的彩色可视化

引言 在现代3D计算机视觉和机器人感知领域&#xff0c;点云数据和图像信息的融合正变得越来越重要。点云数据提供了精确的几何结构&#xff0c;而图像则包含了丰富的颜色和纹理细节。将这两种数据源结合起来&#xff0c;我们能够创建更加逼真和信息丰富的3D场景表示。本文将深…

Django学习笔记之Django基础学习

Django笔记 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录…

剧场的客户端形式区别,APP,小程序,H5的不同优势以及推广方案

剧场的客户端形式区别与推广策略 在数字化时代&#xff0c;剧场的线上化成为大势所趋。不同的线上平台如APP、小程序和H5各有千秋&#xff0c;如何选择最适合自己的平台&#xff0c;并制定有效的推广方案&#xff0c;成为了剧场管理者需要考虑的重要问题。 APP&#xff1a;深度…

nn.functional.softmax(X, dim=-1)

dim-1表示在最后一个维度&#xff08;大概率是一行&#xff09;应用Softmax函数&#xff0c;将值标准化为概率分布。 实例 假设我们有一个张量X&#xff0c;形状为&#xff08;2&#xff0c;3&#xff09;&#xff0c;内容如下&#xff1a; import torch import torch.nn.…