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

news2024/11/28 20:52:27

本篇在上一篇博客(【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.coloradmin.cn/o/1168555.html

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

相关文章

传智杯-21算法赛初赛B组题目详细解法解析-AB题(C/C++、Python、Java)

🚀 欢迎来到 ACM 算法题库专栏 🚀 在ACM算法题库专栏,热情推崇算法之美,精心整理了各类比赛题目的详细解法,包括但不限于ICPC、CCPC、蓝桥杯、LeetCode周赛、传智杯等等。无论您是刚刚踏入算法领域,还是经验丰富的竞赛选手,这里都是提升技能和知识的理想之地。 ✨ 经典…

UG\NX二次开发 先设置默认颜色再创建对象

文章作者:里海 来源网站:里海NX二次开发3000例专栏 感谢粉丝订阅 感谢 qq_42461973 订阅本专栏,非常感谢。 简介 有粉丝问,可不可以先设置默认颜色再创建对象?这个是可以的,下面是例子: 效果 代码 #include "me.hpp" using namespace std;

java/springboot服务第三方接口安全签名(Signature)实现方案

前言 有的时候,我们需要把我们系统里的接口开放给第三方应用或企业使用,那第三方的系统并不在我们自己的认证授权用户体系内,此时,要如何保证我们接口的数据安全和身份识别呢? 在为第三方系统提供接口的时候&#xf…

筑基新一代数据底座,中国科大让智慧科研更有数

著名科学哲学家库恩在《科学革命的结构》中认为,范式是科研的一种理论体系,范式的突破会带来一系列科学革命。 如今在科研领域, 人工智能不断打破科研边界,AI for Science被视为下一个科研新范式,不仅为科学研究带来了…

Cesium:为地图添加指北针、缩放按钮和比例尺

作者:CSDN _乐多_ 网上找的很多代码用不了。本文记录了Cesium中为地图添加指北针、缩放按钮和比例尺的可用代码。 文章目录 一、代码 一、代码 const viewer new Cesium.Viewer(cesiumContainer, {// ...navigationHelpButton: false,sceneModePicker: false,sc…

校验验证码是否过期(定时刷新验证码)

需求: 我们在登录的时候会遇到通过接口请求验证码的操作,这里的验证码会有过期的时间,当我们验证码过期了,我们要进行重新刷新验证码。 我们这里根据后端返回的当前时间和过期时间判断,过期的时间超过了当前时间的时候…

Java面向对象 下(六)

Java面向对象 ( 下) 观看b站尚硅谷视频做的笔记 文章目录 Java面向对象 ( 下)1、 关键字:static1.1、static 的使用1.1.1、static 修饰属性1.1.2、 static 修饰方法1.1.3、 static 修饰代码块1.1.4、 static 修饰内部类1.1.5、类变量 vs 实例变量内存解析 1.2、 自…

关于msvcp120.dll丢失的解决方法详解,快速解决dll丢失问题

在计算机使用过程中,经常会遇到“msvcp120.dll丢失”的错误提示。这个错误提示通常出现在运行某些程序或游戏时,造成相关应用程序可能无法正常启动或运行。那么,究竟是什么原因导致了msvcp120.dll文件的丢失呢?本文将详细解析msvc…

【QT】文件读写

新建项目 加入控件 整体做一个布局 功能&#xff1a;选择文件路径&#xff0c;打开文件&#xff08;两种文件格式&#xff1a;utf-8、GBK&#xff09; #include "widget.h" #include "ui_widget.h" #include <QPushButton> #include <QFileDial…

云产品ECS免费试用获取奖励步骤

文章目录 1、获取活动链接2、报名参加3、试用产品领取产品试用权限配置安全组访问应用提交作品 4、提交任务获取奖励 1、获取活动链接 活动时间2023.11.1&#xff5e;2023.11.30 名额有限&#xff0c;先到先得 进群群主获取活动链接 2、报名参加 直接点击链接进入小程序进行…

【带头学C++】----- 三、指针章* ---- 3.1指针变量的定义

指针在C语言是核心&#xff0c;在C中更是核心。所以本章节将详细讲解指针的使用方法以及指针的一些特殊用法&#xff0c;和引用的区别&#xff0c;以及指针涉及到一些算法基础。通过案例引导&#xff0c;使得能更清楚命明白。在C中的指针是一种数据类型&#xff0c;其使用方法和…

【Java 进阶篇】Java ServletContext功能详解:域对象的使用

Java ServletContext是Java Web应用程序中的一个关键组件&#xff0c;它提供了一种在不同Servlet之间共享数据的机制。这种共享通过域对象来实现&#xff0c;包括ServletContext域、Session域和Request域。在本篇博客中&#xff0c;我们将重点关注ServletContext域&#xff0c;…

批处理写定时关机和开机自动运行老化视频

扬创科技出品的X86平板电脑&#xff08;7寸-21.5寸 6代7代10代酷睿系列 、J4125 、J1900&#xff0c;承接客户各种尺寸定制&#xff09;视频方式老化测试。 需求&#xff1a;1、开机启动自动运行老化视频。 2、下午5点25正式关机。 1、开机启动自动运行老化视频。 start &quo…

ERP系统物料管理

一、ERP系统物料管理的概述 ERP系统物料管理是企业资源计划系统中的一个关键模块&#xff0c;用于管理企业的物料信息、库存和供应链活动。通过集成各个部门的信息和流程&#xff0c;物料管理模块提供了全面的物料控制和管理能力&#xff0c;包括物料采购、入库、出库、库存调…

js 根据word文档模板导出内容

一、创建word导出模板 1、本地创建一个test.docx 2、将最终需要的文档内容及样式编辑完成(图1) 3、将所需动态值的位置,替换为变量参数(图2) 注: 动态值书写 图1 图2 模板值的书写要求 二、项目中使用 1、安装依赖 npm install docxtemplater-image-module-free --save n…

一个查看医保通讯日志的工具

一个查看医保通讯日志的工具&#xff0c;启动是可以选择不同地区。当时是负责实施的同事说&#xff0c;医保出问题时&#xff0c;核对日志文件比方便&#xff0c;所以俺写了这个工具。用于查看东软的通讯日志。这个就是个绿色的小工具。因为不同地区的通讯协议有差别&#xff0…

“第五十九天”

这是昨天那道题&#xff0c;这个后面自己的处理思路还是差了点&#xff0c;这道题关键感觉就是对进位的处理的&#xff0c;由于进位的存在&#xff0c;所以处理数据的时候只能从最低位开始&#xff0c;我一开始是从高位处理的&#xff0c;而且后面越来越迷&#xff0c;这个点一…

FSB逮捕为乌克兰网络部队工作的俄罗斯黑客

导语 近日&#xff0c;俄罗斯联邦安全局&#xff08;FSB&#xff09;逮捕了两名涉嫌协助乌克兰网络部队对俄罗斯重要基础设施目标进行网络攻击的个人。这起事件引起了广泛关注&#xff0c;涉及到了网络安全和国际关系等多个领域。本文将为您详细介绍这一事件的背景和最新进展。…

思维训练3

题目描述1 Problem - A - Codeforces 题目分析 样例1解释&#xff1a; 对于此题&#xff0c;我们采用贪心的想法&#xff0c;从1到n块数越少越好&#xff0c;故刚好符合最少的块数即可&#xff0c;由于第1块与第n块是我们必须要走的路&#xff0c;所以我们可以根据这两块砖的…

leetcode 117

leetcode 117 代码 #include <iostream>// Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}No…