UE4第一人称物理柄组件(PhysicsHandle)抓取---物理拾取

        此抓取功能仅可抓取带有模拟物理(Simulate Physics)的可移动网格体或者带有物理模拟的蓝图组件

首先创建第一人称角色

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDppqxGby4,size_20,color_FFFFFF,t_70,g_se,x_16

在角色的合适位置添加相机(Camera)并将使用Pawn控制旋转(Use Pawn Control Rotatioin)勾上

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

到这里准备工作已经完毕,接下来开始写蓝图。

根据项目设置--输入中的轴映射

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

如果项目设置中没有 可以添加项目自带功能包的第一人称模板

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

 在角色蓝图事件图表中 添加角色的移动事件

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

添加物理柄组件(PhysicsHandle)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_10,color_FFFFFF,t_70,g_se,x_16

 添加鼠标左键点击事件 (InputAction Fire)

a8718984083249d9be15065306164b51.png

添加射线检测节点(Line TraceBychannel),左侧输入节点选上针对时长(For Duration)和可视性(Visibility)

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_18,color_FFFFFF,t_70,g_se,x_16

这里的Start是射线开始的起点,所以我们需要获取相机的位置(GetWorldLocation)来设置成射线的起点

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

而End是指射线的结束,也可以理解成射线的最长距离

可以在相机的位置(GetWorldLocation)加上相机的向前的向量(GetForwardVector)乘以1000个单位(1000等于10米)设置成射线的终点

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

将射线检测节点的输出节点中找到检测的组件(Out Hit Hit Component)提升为变量

同时获取此组件的场景变换(GetWorldTransform)

然后将物理手组件拖入图表中

并获取物理手在位置抓取的带旋转的组件(Grab Component at Location with Rotation)

最后对应相连

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

 获取到组件之后,我们就该设置组件被抓取后的位置, 因为被抓取后他的位置会跟随玩家的移动时时刻刻的在更新位置,所以这里我们用到事件Tick(Event Tick)

将物理手拖进事件图表,获取他的抓取组件(Get Grabbed Component)

因为他有没抓上的可能所以需要做下判断

这里用到valid(有效)节点和Branch节点做判断,当判断结果为True(抓到有效组件东西)时,设置被抓取组件的位置和旋转(Set Target Location and Rotation)

判断为False(没抓到有效组件或者抓到组件之外的东西时)不做响应

因为其中包含了旋转(Rotation),所以我们需要获取相机的场景变换(GetWorldTransform),场景变化的旋转就是连接到被抓取组件的旋转,而位置需要加上相机向前向量乘以300(3米)在连接到被抓取组件的新位置上

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

 在当我们需要放下的时候需要在Fire的松开时添加物理手的释放组件(Release Component)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

这是所有用到的节点

当然,在任务量巨大使用频繁的情况下,可将射线检测和获取目标位置的节点通通写成函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6aasRm8u,size_20,color_FFFFFF,t_70,g_se,x_16

猜你喜欢

转载自blog.csdn.net/weixin_50755154/article/details/123182717
今日推荐