本篇在上一篇博客(【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后文本控件的值也会增加