Player Pawn

现在我们进行的项目是第一人称的。本篇文章我们继续实现以下功能:在玩家视角位置生成物体,并向视线方向“发射”物体。

在游戏运行前的大纲视图里,我们会看到有一个“Player Start” Actor。在视口窗体中显示胶囊形状。看名字是指示 Player 生成的初始位置。

具体的 Player 是动态生成的。我们运行游戏,如图 1 所示,按 F8 键,从玩家视角分离出来。可以看到场景中自动生成了 DefaultPawn 等 Actor。

F8 键:有点西游记里“灵魂出窍”的那个感觉。

图1 DefaultPawn

如图 2 所示,我们可以使用 Get Player Pawn 节点获取玩家 Pawn 对象。输入的 Player Index 指示玩家索引号,我们这边就使用默认的 0。

我们运行游戏,左右移动视角。在详情视图里,可以看到 DefaultPawn0 的位置信息也随之改变。所以我们这边使用 Get Actor Location 节点,获取玩家此时的位置信息,并将其设置为生成“炮弹”的位置。

运行游戏时,旋转视角。我们发现 DefaultPawn0 的旋转信息没有随之改变。但我们看到有一个 PlayerController0 Actor,它的旋转信息是随之改变的。所以我们使用 Get Control Rotation 节点,获取控制器的旋转信息,并将其设置为生成“炮弹”的旋转。

图2 Get Player Pawn

此时可以看成,生成的炮弹已经“继承”了相机的变换信息了。

现在我们已经完成在玩家视角位置生成物体,接着需要完成向视线方向“发射”物体。

因为生成的炮弹“继承”了相机的变换信息,所以如图 3 所示,我们直接对生成物体使用 Get Actor Forward Vector 节点,就能得到视线方向。

这边的 Forward 向量,从理论上猜测,就是视图变化里 lookat 到 eye 的向量。

就是视线方向。

就是 Actor 局部坐标系变换,在世界坐标系中表示的那组正交基。

得到的 Forward 向量是单位向量,直接作用于冲量太小了,我们继续作用乘法节点。

图3 Forward Vector

至此,功能已经全部实现。效果如以下视频所示,我们依次瞄准,然后打飞了所有启用物理模拟的物体。