当前位置: 首页 > news >正文

【UE】从UI中拖拽生成物体

目录

效果

步骤

一、准备工作 

二、创建UI

三、创建Actor

四、拖拽生成Actor的逻辑


效果

步骤

一、准备工作 

1. 首先新建一个第三人称模板工程

2. 新建一个游戏模式基础,这里命名为“BP_UIGameMode”

在世界场景设置中设置游戏模式覆盖为“BP_UIGameMode”

3. 复制一份“ThirdPersonCharacter”作为默认的pawn类,这里更改命名为“BP_UICharacter”

4. 新建一个HUD类,这里命名为“BP_UIHUD”

5. 新建一个玩家控制器类,这里命名“BP_UIPlayerController”

6. 在选中的游戏模式中设置默认pawn类、HUD类、玩家控制器类为上面新建的

7. 为了能够在游戏运行时显示鼠标,可以打开玩家控制器“BP_UIPlayerController”,勾选“显示鼠标光标”

8. 此时运行游戏发现可以通过鼠标左键和鼠标右键控制摄像机的朝向,但是我们的目标是通过鼠标左键来实现拖拽效果的。因此需要打开“BP_UICharacter”,做一些修改。

首先添加一个布尔类型的变量,这里命名为“isCanTurn”,用于表示此时是否能够控制摄像机转向

在事件图表中添加如下节点,表示当按下鼠标右键时,可以控制摄像机转向,松开后就不能转向了

修改控制摄像机转向的逻辑,设置只有变量“isCanTurn”为True时才可以的转动摄像机

9. 删除场景中的“ThirdPersonCharacter”。此时运行游戏可以发现只能通过鼠标右键控制摄像机的旋转,鼠标左键无法再控制摄像机的旋转了。

二、创建UI

1. 首先创建一个铺满整个屏幕的控件蓝图,这里命名为“WBP_Main”

2. 打开“BP_UIHUD”,在事件图表中添加如下节点,使得控件蓝图“WBP_Main”能够被渲染到视口上

3. 接下来制作拖拽部分的UI,新建两个控件蓝图,这里分别命名为“WBP_DragUI”和“WBP_DragActor”,一个表示通过拖拽出图片来生成模型,另一个表示直接拖出模型

4. 先打开“WBP_DragUI”,设置自定义大小

删除画布面板

添加一个尺寸框控件

设置尺寸框的“宽度覆盖”和“高度覆盖”均为100

在尺寸框中添加一个图像控件

设置一下图像和图像着色

5. 接下来设置第二个控件蓝图“WBP_DragActor”,打开“WBP_DragActor”,这里除了颜色不同,其他所有地方和“WBP_DragUI”保持一致

6. 打开主界面“WBP_Main” ,将控件蓝图“WBP_DragUI”和“WBP_DragActor”拖入

此时运行游戏可以发现控件蓝图已经被添加到视口中

三、创建Actor

我们想从UI中通过拖拽的方式生成Actor,首先我们需要创建一个Actor蓝图,这里就命名为“BP_Cube”

打开“BP_Cube”,添加一个立方体形状的静态网格体

注意设置立方体没有碰撞

四、拖拽生成Actor的逻辑

1. 首先打开“WBP_DragUI”,添加一个覆盖函数,选择“按下鼠标按钮时”

我们需要在鼠标按下时侦测是鼠标哪个按键按下,这里设置的只侦测鼠标左键

再添加一个覆盖函数“发现拖动时”

当检测到鼠标拖动时,创建一个和自身一模一样的控件。由于上一步设置的只侦测鼠标左键的拖动事件,因此这里通过鼠标右键拖动是不会侦听到的。

此时效果如下:(鼠标左键按下UI不松,可以拖出UI)

 接下里我们就要在鼠标松开的时候生成actor,继续在“WBP_DragUI”中添加一个“拖动取消时”的重载函数

逻辑如下

此时已经可以通过拖拽出UI来生成actor了,效果如下:

为了增加代码复用性,我们新建一个蓝图函数库

这里命名为“BP_FunctionLibrary”

在蓝图函数库中新增一个函数,这里命名为“LineTraceReturnLocation”,表示射线检测返回射线碰撞位置

为该函数添加一个向量类型的输出,命名为“HitLocation”

函数内容如下

2. 回到“WBP_DragUI”,将拖动取消时事件的相关代码简化:

3. 下面制作从UI拖出Actor来生成Actor的功能,打开控件蓝图“WBP_DragActor”

同样的,添加一个“按下鼠标按钮时”的覆盖函数

函数逻辑如下:同样需要添加一个对鼠标左键拖动的侦听,然后生成一个Actor,其中变量“IsCubeCanMove”表示生成的方块是否可以进行移动

此时运行游戏发现只能在鼠标按下时生成方块但是无法拖动。

4. 打开主界面“WBP_Main” ,在图表中添加覆盖函数“鼠标移动时”

该函数逻辑如下

再添加“松开鼠标按钮时”

松开时设置方块不能移动

此时运行发现生成的Actor只能在小UI范围内拖动,因此我们需要在“WBP_Main”中再添加一个底图

设置锚点

设置完全透明

设置这个透明背景在最底层

此时运行效果如下:

 

相关文章:

【UE】两步实现“从UI中拖出Actor放置到场景中”-CSDN博客

参考视频:

https://www.bilibili.com/video/BV1mU4y117z9/?spm_id_from=333.999.0.0&vd_source=36a3e35639c44bb339f59760641390a8

相关文章:

  • YOLOv5独家首发改进新主干:改进版目标检测新范式骨干PPHGNetv2,百度PaddlePaddle出品,有效提升YOLOv5检测器检测精度
  • echarts的图表立体感——实现立体柱状图和立体饼图的详细教程
  • 利用移动互联、物联网、智能算法、地理信息系统、大数据分析等信息技术开发的智慧工地云平台源码
  • C/C++ 实现UDP发送或接收组播消息,并可指定接收发送网卡
  • ant Java任务的jvmargs属性和<jvmarg>内嵌元素
  • uniapp-自定义表格,右边操作栏固定
  • 探索网络攻防技术:自学之道
  • 大模型时代目标检测任务会走向何方?
  • 力扣每日一题91:解码方法
  • zigbee协议栈组播通讯 From zigbee菜鸟笔记(十 三)
  • Delphi 11.3中从一个日期时间中算出当月(当年、当季)的第一天与最后一天
  • Java17-20新特性
  • 数据库-索引
  • 网络工程师基础知识(2)
  • 量化交易-应对市场闪崩
  • 2019.2.20 c++ 知识梳理
  • canvas 高仿 Apple Watch 表盘
  • gcc介绍及安装
  • HTTP那些事
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • leetcode388. Longest Absolute File Path
  • mysql外键的使用
  • passportjs 源码分析
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Ruby 2.x 源代码分析:扩展 概述
  • SpiderData 2019年2月13日 DApp数据排行榜
  • storm drpc实例
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 讲清楚之javascript作用域
  • 小程序01:wepy框架整合iview webapp UI
  • 责任链模式的两种实现
  • 找一份好的前端工作,起点很重要
  • Linux权限管理(week1_day5)--技术流ken
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • (10)STL算法之搜索(二) 二分查找
  • (solr系列:一)使用tomcat部署solr服务
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (五)关系数据库标准语言SQL
  • (一) storm的集群安装与配置
  • *Django中的Ajax 纯js的书写样式1
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net 发送邮件
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .pyc文件是什么?
  • @test注解_Spring 自定义注解你了解过吗?
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [20150321]索引空块的问题.txt
  • [acm算法学习] 后缀数组SA
  • [Angular] 笔记 18:Angular Router
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [c语言]小课堂 day2
  • [ES-5.6.12] x-pack ssl
  • [HackMyVM]靶场Boxing