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

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值