此抓取功能仅可抓取带有模拟物理(Simulate Physics)的可移动网格体或者带有物理模拟的蓝图组件
首先创建第一人称角色
在角色的合适位置添加相机(Camera)并将使用Pawn控制旋转(Use Pawn Control Rotatioin)勾上
到这里准备工作已经完毕,接下来开始写蓝图。
根据项目设置--输入中的轴映射
如果项目设置中没有 可以添加项目自带功能包的第一人称模板
在角色蓝图事件图表中 添加角色的移动事件
添加物理柄组件(PhysicsHandle)
添加鼠标左键点击事件 (InputAction Fire)
添加射线检测节点(Line TraceBychannel),左侧输入节点选上针对时长(For Duration)和可视性(Visibility)
这里的Start是射线开始的起点,所以我们需要获取相机的位置(GetWorldLocation)来设置成射线的起点
而End是指射线的结束,也可以理解成射线的最长距离
可以在相机的位置(GetWorldLocation)加上相机的向前的向量(GetForwardVector)乘以1000个单位(1000等于10米)设置成射线的终点
将射线检测节点的输出节点中找到检测的组件(Out Hit Hit Component)提升为变量
同时获取此组件的场景变换(GetWorldTransform)
然后将物理手组件拖入图表中
并获取物理手在位置抓取的带旋转的组件(Grab Component at Location with Rotation)
最后对应相连
获取到组件之后,我们就该设置组件被抓取后的位置, 因为被抓取后他的位置会跟随玩家的移动时时刻刻的在更新位置,所以这里我们用到事件Tick(Event Tick)
将物理手拖进事件图表,获取他的抓取组件(Get Grabbed Component)
因为他有没抓上的可能所以需要做下判断
这里用到valid(有效)节点和Branch节点做判断,当判断结果为True(抓到有效组件东西)时,设置被抓取组件的位置和旋转(Set Target Location and Rotation)
判断为False(没抓到有效组件或者抓到组件之外的东西时)不做响应
因为其中包含了旋转(Rotation),所以我们需要获取相机的场景变换(GetWorldTransform),场景变化的旋转就是连接到被抓取组件的旋转,而位置需要加上相机向前向量乘以300(3米)在连接到被抓取组件的新位置上
在当我们需要放下的时候需要在Fire的松开时添加物理手的释放组件(Release Component)
这是所有用到的节点
当然,在任务量巨大使用频繁的情况下,可将射线检测和获取目标位置的节点通通写成函数