【UE】从UI拖拽生成物体 —— 更改位置与定点销毁

news/2024/11/26 7:20:57/

本篇在上一篇博客(【UE】从UI中拖拽生成物体-CSDN博客)基础上继续增加更改生成的Actor的位置与定点销毁Actor的功能。

目录

效果

步骤

一、修改生成好的Actor位置

解决问题一:从UI拖出多个actor后,只能对第一个拖出的actor的位置进行移动

方式一:(不推荐)

方式二:(推荐)

解决问题二:从UI拖出actor,actor会自己往前跑的问题

二、定点销毁Actor 


效果

步骤

一、修改生成好的Actor位置

1. 打开默认的pawn类“BP_UICharacter”

新增一个布尔类型的变量,这里命名为“isCanMove”

在事件图表中设置鼠标左键点击时可以移动actor,松开时不可以移动

添加一个自定义事件,该事件用于移动方块,首先当事件开启时从鼠标位置向场景中发射一条射线

射线命中时判断一下是否获取到“BP_Cube”的对象引用,如果没有获取就尝试将射线检测到的物体转为“BP_Cube”类型,如果获取到就可以设置此时“BP_Cube”的位置并且设置actor无碰撞(设置无碰撞的原因是此时射线就不会检测actor边缘而是穿过去)

在“事件Tick”中每一帧都去判断一下当前鼠标左键是否按下,如果按下就执行自定义事件“MoveCube”

2. 打开“BP_Cube”,需要设置立方体的碰撞预设为自定义,碰撞已启动为“纯查询(无物理碰撞)”,忽略除射线检测外其他所有类型的碰撞,这样我们才能使用射线检测到“BP_Cube”

此时效果如下所示:

解决问题一:从UI拖出多个actor后,只能对第一个拖出的actor的位置进行移动

此时会有一个问题:就是当我们再拖出一个方块然后准备移动,移动的却是前一个创建的方块。这里有两种解决方式,推荐第二种解决方式:

方式一:(不推荐)

当玩家新拖出一个方块时,将之前的获取的“BP_Cube”的对象引用清空。这样只能修改新拖出方块的位置,不能修改之前拖出的方块的位置。

1. 具体上,先打开HUD类“BP_UIHUD”,在事件图表中当我们创建主界面“WBP_Main”时,将其提升为变量,这样在HUD中就有了“WBP_Main”的对象引用。

2. 打开“WBP_DragUI”,创建一个事件调度器,这里命名为“Btn_DragUI_IsClick”,用于告知外界此时控件已经被点击了(在覆盖函数“OnMouseButtonDown”中调用该事件调度器)

3. 回到“BP_UICharacter”中,当事件开始时我们获取到HUD,将其类型转换为“BP_UIHUD”,从中获取到主界面“WBP_Main”,再从主界面中获取到“WBP_DragUI”,然后绑定一个自定义事件用于清空“BP_Cube”的引用

此时运行游戏可以发现,每次新拖出一个actor就能对这个新拖出的actor进行移动:

方式二:(推荐)

1.在“BP_UICharcter”的事件图表中,添加一个自定义事件,这里命名为“ReleaseCube”,该事件的逻辑如下,当该事件执行后,先判断当前的对“BP_Cube”的对象引用是否有效,如果有效的话就将actor的碰撞重新启用,然后清空当前对“BP_Cube”的引用。

然后设置当我们松开鼠标左键的时候执行自定义事件“ReleaseCube”

此时可以看到我们可以对任何生成的actor进行移动:

此时我们已经完成了从UI拖出UI来生成actor的功能。但是从UI拖出actor来生成actor还有问题。

解决问题二:从UI拖出actor,actor会自己往前跑的问题

我们需要打开控件蓝图“WBP_DragActor”,在覆盖函数“OnMouseButtonDown”中,设置生成actor后取消actor的碰撞

此时已经可以从UI中拖出actor了,但是无法对生成的actor移动,这是因为actor在放置后碰撞没有恢复,导致射线无法检测到生成后的actor。我们需要在主界面“WBP_Main”的覆盖函数“OnMouseButtonUp”中恢复actor的碰撞

此时效果如下,可以看到我们已经实现了从UI拖出actor来生成actor,并且可以对生成后的actor进行移动。

二、定点销毁Actor 

 接下来我们要实现的功能是将actor拖到UI上来销毁,类似于回收的功能。

1. 首先创建一个控件蓝图,这里命名为“WBP_Sale”

打开“WBP_Sale”,将填充屏幕更改为“自定义”

删除画布面板

添加一个尺寸框,在尺寸框中再添加一个按钮

给按钮添加一点样式

2. 打开主界面“WBP_Main”,将“WBP_Sale”拖到画布面板上,这样就可以在视口显示了

3. 回到“WBP_Sale”,在事件图表中,当事件构造时,获取玩家控制的pawn将其转换为“BP_UICharacter”并提升为变量。

当鼠标在按钮上悬停时,销毁此时的拖动的actor

4. 打开“BP_UICharacter”,为了防止在释放Cube时,自定义事件“ReleaseCube”先一步执行清空“BP_Cube”的操作导致上一步中失去对“BP_Cube”的引用,因此这里需要加一点延迟再把“BP_Cube”清空

此时运行效果如下所示:

5. 如果希望统计一下我们销毁了多少个actor

1. 我们可以在主界面“WBP_Main”中添加一个文本控件

可以设置文字居中显示

2. 打开“WBP_Sale”,添加一个整数类型的变量,这里命名为“Num_destoryActor”,表示销毁的actor的数量

当销毁actor后,我们将变量“Num_destoryActor”加1

3. 回到主界面“WBP_Main”中,对文本控件中创建一个绑定函数

绑定函数逻辑如下,只要“Num_destoryActor”发生变化,文本控件的内容也会发生改变

此时运行效果如下,可以看到当摧毁actor后文本控件的值也会增加


http://www.ppmy.cn/news/1192427.html

相关文章

公司老项目springmvc jsp 自定义多数据源 转到springboot 整理

真实完整步骤,踩坑整理 有同样的坑,欢迎补充整理 网上的案例老是少了很多配置,本案例涉及到 spring-mvc,自定义多数据源,统一前缀,事务,mybatis,jsp访问异常,静态文件。…

正则表达式续篇

位置锚定: ^:行首锚定,表示以什么为开头 例如: $:行尾锚定,表示以什么为结尾 例如: ^:匹配的是空行 例如: ^root$:匹配整行,而且整行只能有这一个字符串 实验&#x…

搜维尔科技:scalefit生物力学人体工学软件分析!

人体工程学分析 21加载参数和头像显示 识别(隐藏的)健康风险 根据DGUV交通灯进行生物反馈(DIN/ISO) 实时应力分析 三维空间可视化 静态/动态肩载 用左/右赋值加载输入 腰椎间盘压缩计算 距离和定时器显示 带有运动跟踪的化身/视频叠加 外骨骼与CAD工作站仿真 CSV原始…

目标检测算法改进系列之添加EIOU,SIOU,AlphaIOU,FocalEIOU等

YOLOv8添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU等 yolov8中box_iou其默认用的是CIoU,其中代码还带有GIoU,DIoU,文件路径:ultralytics/yolo/utils/metrics.py,函数名为:bbox_iou 原始代码 def bbox_i…

【vtk学习笔记4】基本数据类型

一、可视化数据的基本特点 可视化数据有以下特点: 离散型 计算机处理的数据是对无限、连续的空间进行采样,生成的有限采样点数据。在某些离散点上有精确的值,但点与点之间值不可知,只有通过插值方式获取数据具有规则或不规则的结…

【数据结构】单向链表的增删查改以及指定pos位置的插入删除

目录 单向链表的概念及结构 尾插 头插 尾删 ​编辑 头删 查找 在pos位置前插 在pos位置后插 删除pos位置 删除pos的后一个位置 总结 代码 单向链表的概念及结构 概念:链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是…

美观且可以很方便自定义的MATLAB绘图颜色

函数介绍 主函数是draw_test,用于测试函数。 draw_h是函数,用于给Matlab提供美观且可以很方便自定义的绘图颜色。 draw_h函数介绍 这是一个带输入输出的函数,输入1/2/3,输出下面三种颜色库的配色,每种库均有五种颜色…

2023年国赛如何运行脚本文件

1、设备脚本文件运行: 链接:https://pan.baidu.com/s/1xqLvO0k7LIJVLkzcL0KohQ?pwdwgzj 提取码:wgzj 二维码 2、linux虚拟机脚本文件运行 链接:https://pan.baidu.com/s/1vzRt01AT4u77ynel1KWCaw?pwdwgzj 提取码&#xff1…