接着上面工程,因为射线检测使用的比较多,所以我们创建一个蓝图函数库把射线检测代码封装到新建函数LineTrace中,给他一个返回值Location
顺便使用LineTrace优化WBP_DragUI射线检测代码,如下
1:在WBP_DragActor重写OnMouseButtonDown事件
2:增加鼠标左键检测
3:根据鼠标左键拖拽的位置产生射线,并且返回射线射到的位置调用SpawnActorBPCube
4:新生成的Actor我们使用变量BP_Cube存起来,新增变量B_CanMove用来控制拖拽结束后BP_Cube物体停止跟随移动。
1:在WBP_Main重写OnMouseMove实现物体生成后跟随鼠标移动
2:根据鼠标的位置调用我们封装的LineTrace函数产生射线在3D场景结束点的位置,并且把这个位置给到上面创建的BP_Cube。
1:同样的方法在WBP_Main重写OnMouseButtonUp处理拖拽结束,首先WBP_Drag_Actor的B_CanMove设置为false,但是经过测试发现在第一次拖拽的时候,3D场景会跟随移体验不好,目前采用解决方案是 在拖拽的时候,限定交互只在UI,所以 我们回到WBP_DragActor的OnMouseButtonDown函数中在刚开始进行拖拽的时候,鼠标交互锁定在UI上。
2:在拖拽结束后,也就是WBP_Main的OnMouseButtonUp函数中回复对UI和游戏场景的交互
由于在WBP_Main重写的事件都是针对WBP_Main的UI范围的,所以我们如果想在整个屏幕中进行拖拽,就需要为WBP_Main增加一个全屏的底图,
1:这里我们新增一个Image,
2:把Image的着色改成透明
3:Image的ZOrder改成-1确保在最下方
好了,我们本期要做的就这么多,看一下效果吧
至此两种方式的拖拽都已经实现,体验较流畅!
最后补充说明一下,方法1拖拽UI采用的检测拖拽的OnDragDetected函数,通过创建CreateDragDropOperation节点让新创建的UI跟随载体移动
能不能用来实现方法2的Actor物体移动哪?答案是不能的,因为CreateDragDropOperation节点中能控制的DefaultDragVisual必须是Widget类型的,也就是说这个节点是针对UI的,所以方法1可以用,方法2不能直接使用,一种方式是自己实现节点可以直接Actor物体移动,另一种就是把跟随鼠标移动的功能自己实现,本文就是在WBP_Main中通过重载OnMouseButtonDown实现的,当然这种方法也有个小局限就是WBP_Main限制了移动范围。
好了这一期就到这里了,希望对你有所帮助!辛苦之至,希望点赞支持一下!
页面更新:2024-04-23
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号