目录
效果

步骤
一、制作准心
- 新建一个HUD,这里命名为"HUD_ZhunXin",同时复制一个第三人称模板蓝图,这里命名为"BP_Character"

- 在世界场景设置中,设置默认pawn类为"BP_Character",HUD类为"HUD_ZhunXin"

- 打开"HUD_ZhunXin",点击重载"接收绘制HUD"

此时会出现如下节点,该节点输出的"SizeX"和"SizeY"分别表示视口尺寸的长和宽

接下来我们就要在视口中心画一个十字准心,可以通过"绘制线条"节点来分别绘制一条横线和竖线来表示准心。"绘制线条"节点如下,需要传入线段起始点和终点的坐标,LineColor是线段的颜色,LineThickness表示线条的粗细

通过如下节点,我们就可以绘制出十字准心中的横线线段(起始点与终点的纵坐标不变,横坐标分别在中心点横坐标基础上加减5)

再绘制出竖线线段(起始点与终点的横坐标不变,纵坐标分别在中心点纵坐标基础上加减5)

此时运行游戏可以看到十字准心已经绘制在视口正中心的位置

二、简单的第三人称视角偏移
为了让抓取时从摄像机看到的视角比较直接,这里需要对第三人称角色模板蓝图中的摄像机做一点偏移,打开"BP_Character"

对"FollowCamera"的位置和旋转做一点调整,如下所示

此时运行可以看到摄像机的画面相对于人物向右偏移了一点

还需勾选"使用Pawn控制旋转"

三、基于屏幕正中央的打点与射线
- 还是先打开"BP_Character",新建一个图表,这里命名为"物理抓取"

然后添加一个"物理柄组件"


在图表"物理抓取"中添加如下节点,这样当我们点击鼠标后就会从屏幕中心向场景中发出一条射线

四、物理抓取的实现(抓取、放下、丢出)
- 首先我们创建一个actor蓝图,命名为"BP_Cube",打开"BP_Cube",添加一个立方体组件。该蓝图代表可被抓取的物体

一定要勾选模拟物理,并且设置网格体是可移动的

将"BP_Cube"放入场景中,为了区分我们更改材质为红色

- 打开"BP_Character",继续添加如下节点
当我们发出射线后,先判断有没有检测到物体,如果检测到了就判断该物体的类型是不是"BP_Cube"(就是我们想抓取的这一类物体),如果是的话获取到Hit Component,

然后我们就可以利用物理柄组件来抓取物体

为了防止抓取的物体撞到玩家自己,我们设置Hit Component忽略所有Pawn的碰撞

在刚开始抓取的时候加一个判断,如果"Hit Component"不是有效的就把他抓起来

如果是有效的就把物体放下,然后把"Hit Component"置为空

还需添加如下节点,每帧设置物理抓取组件的位置

此时我们已经完成了抓取和放下的功能,效果如下:

此时有个问题是,当拾取的物体碰到其他物体时会产生非常大的旋转,我们可以通过增大网格体的角阻尼来解决这个问题:

接下来制作将物体丢出去的功能,如下图,主要通过添加冲量的方式来向指定方向扔出物体

效果如下:

参考视频: