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

本篇在上一篇博客(【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.hqwc.cn/news/160863.html

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

相关文章

[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)

(static成员 explicit 友元函数 内部类 编译器优化) 一.static 成员:1.概念引入:1-1:定义全局变量记录个数? 2.如果有多个类需要分开去记录类对象的个数?2-1:可不可以声明成员变量解决&#…

Ubuntu下安装vscode,并解决终端打不开vscode的问题

Visual Studio Code安装 1,使用 apt 安装 Visual Studio Code 在官方的微软 Apt 源仓库中可用。按照下面的步骤进行即可: 以 sudo 用户身份运行下面的命令,更新软件包索引,并且安装依赖软件: sudo apt update sud…

2.Docker基本架构简介与安装实战

1.认识Docker的基本架构 下面这张图是docker官网上的,介绍了整个Docker的基础架构,我们根据这张图来学习一下docker的涉及到的一些相关概念。 1.1 Docker的架构组成 Docker架构是由Client(客户端)、Docker Host(服务端)、Registry(远程仓库)组成。 …

IOS手机耗电量测试

1. 耗电量原始测试方法 1.1 方法原理: 根据iPhone手机右上角的电池百分比变化来计算耗电量。 1.2实际操作: 在iOS通用设置中打开电池百分比数值显示,然后操作30分钟,60分钟,90分钟,看开始时和结束时电池…

木马捆绑+签名修改(CobaltStrike免杀)

今天我们就来聊一下什么是捆绑木马,说起捆绑木马我相信一些人肯定觉得很陌生。在日常中我相信大家经常可能会遇到这样的一个问题,在一些网站上下载一个电脑软件结果电脑上就被莫名其妙的安装上了一个全家桶(流氓软件)。这就是通过简单的捆绑技术将一些你不需要的广告软件安…

CSS画圆以及CSS实现动态圆

CSS画圆以及CSS实现动态圆 1. 先看基础(静态圆)1.1 效果如下:1.2 代码如下: 2. 动态圆2.1 一个动态圆2.1.1 让圆渐变2.1.2 圆渐变8秒后消失2.1.3 转动的圆(单个圆) 2.2 多个动态圆 1. 先看基础(…

在Google Kubernetes集群创建分布式Jenkins(一)

因为项目需要,在GKE的集群上需要创建一个CICD的环境,记录一下安装部署一个分布式Jenkins集群的过程。 分布式Jenkins由一个主服务器和多个Agent组成,Agent可以执行主服务器分派的任务。如下图所示: 如上图,Jenkins Ag…

Linux - 进程控制(上篇)- 进程创建 和 进程终止

进程控制 进程创建 对于进程的创建,你肯定知道,在 C/C 当中使用 fork()函数,以当前可执行程序生成的进程为 父进程,创建这个父进程的 一个子进程,这个 子进程就是一个新的进程。 如上图所示&a…

顶层模块【FPGA】

1顶层模块: 不能像C语言的h文件那样,把io的定义放在其他文件。 在Verilog中,顶层模块是整个设计的最高层次,它包含了所有其他模块和子模块。 顶层模块定义了整个设计的输入和输出端口,以及各个子模块之间的连接方式。…

【qemu逃逸】D3CTF2021-d3dev

前言 题目给的是一个 docker 环境,所以起环境非常方便,但是该怎么调试呢?有无佬教教怎么在 docker 中调试? 我本来想着直接起一个环境进行调试,但是缺了好的库,所以就算了,毕竟本题也不用咋调…

MFC 窗体插入图片

1.制作BMP图像1.bmp 放到res文件夹下,资源视图界面导入res文件夹下的1.bmp 2.添加控件 控件类型修改为Bitmap 图像,选择IDB_BITMAP1 3.效果

操作系统——初始文件管理(王道视频p58)

1.总体概述: 这一节,主要是 作为 后续 “文件系统”的引子 我认为可以思考的点: (1)文件之间的逻辑结构——windows中采用根什么的“树状结构”,而文件在外存中的实际物理结构又是什么样的 &#xff08…