创建瞄准偏移

在本指南中,我们将创建瞄准偏移 ,瞄准偏移是一种资源,可以存储一系列混合姿势,帮助 Character 瞄准武器。我们将选用一个动画序列并将其切分成可用于瞄准偏移的姿势,获取玩家鼠标的俯仰/偏航位置,以确定使用哪个混合姿势才能让 Character 移动并瞄准鼠标的位置(存在一些限制),如以下示例所示。

本页面的内容:

对于本指南,我们已经使用 Blueprint Third Person 模板创建了新项目,并启用了 默认资源

我们还会使用 Animation Starter Pack,您可通过 商城 免费下载。

AnimationAssetPack.png

下载后,您可以从启动程序,通过 Add To Project 按钮将 Animation Starter Pack 添加到您的项目中。

创建瞄准姿势

在本部分,我们将通过切分动画序列来创建瞄准偏移所需的瞄准姿势。

  1. 打开项目,在 内容浏览器Game/Blueprints 文件夹下,打开 MyGame 蓝图。

  2. Default Pawn Class 下单击下拉菜单,并选择 ASP_Character

    Animations1.png

  3. 编译保存,然后关闭蓝图。

  4. 内容浏览器 中打开 Game/AnimStarterPack 文件夹。

  5. 单击 Create 按钮,创建一个名为 AimPoses 的文件夹。

    AimOffset1.png

  6. Aim_Space_Ironsights 资源拖到 AimPoses 文件夹上,然后选择 Copy

    AimOffset2.png

    这是包含一系列瞄准武器动作的动画序列,我们需将其切分成各个姿势。

  7. AimPoses 文件夹内,选择 Aim_Space_Ironsights,然后按下 Ctrl+W 进行复制,并将其命名为 Aim_Center

    AimOffset3.png

  8. 打开 Aim_Center 资源,单击播放控件中的 暂停 按钮,然后单击 ToFront 按钮。

    AimOffset4.png

    这样就可以确保动画当前位于 102 个帧的第 0 帧处。

  9. 右键单击 时间轴中的擦除栏,然后选择 Remove from frame 1 to frame 102 选项。

    AimOffset5.png

  10. 再次 右键单击 时间轴中的擦除栏,然后选择 Remove from frame 1 to frame 2 选项。

    AimOffset6.png

    此时,您的时间轴应该如下图所示。

    AimOffset7.png

    这样,我们就得到了一个单帧,其中包含一个可用于瞄准偏移的姿势。

  11. 单击 Save,然后关闭 Aim_Center 动画。

  12. AimPoses 中,选择 Aim_Space_Ironsights,然后按下 Ctrl+W 进行复制,并将其命名为 Aim_CenterDown

    AimOffset8.png

  13. 打开 Aim_CenterDown,确保它位于第 0 帧,然后单击 下一个 按钮,转到第 20 帧。

    AimOffset9.png

    此时,视窗中将显示 Character 向下瞄准,这正是我们想用于瞄准下方的姿势。

  14. 右键单击 时间轴中的擦除栏,然后选择 Remove frame 0 to frame 19 选项。

    AimOffset10.png

    根据您在擦除栏上 右键单击 的位置,帧范围可能会不同,但只需确保 Character 瞄准下方即可。

  15. 再次 右键单击 时间轴中的擦除栏,然后选择 Remove from frame 1 to frame 83 选项。

    AimOffset11.png

    您的 Aim_CenterDown 动画此时在时间轴中应该如下图所示,而且视窗中显示 Character 瞄准下方。

    AimOffset12.png

  16. AimPoses 中,选择 Aim_Space_Ironsights,然后按下 Ctrl+W 进行复制,并将其命名为 Aim_CenterUp

    AimOffset13.png

  17. 打开 Aim_CenterUp,确保它位于第 0 帧,然后单击 下一个 按钮,转到第 10 帧。

  18. 右键单击 时间轴中的擦除栏,然后选择 Remove frame 0 to frame 10 选项。

    AimOffset14.png

    同样,根据您在擦除栏上 右键单击 的位置,帧范围可能会略有不同,但只需确保 Character 向上瞄准即可。

  19. 再次 右键单击 时间轴中的擦除栏,然后选择 Remove from frame 1 to frame 92 选项。

    AimOffset15.png

    您的 Aim_CenterUp 动画此时在时间轴中应如下图所示,而且视窗中显示 Character 瞄准上方。

    AimOffset16.png

    现在,您已经创建了瞄准中心、瞄准下方和瞄准上方姿势;重复上述步骤,创建瞄准左侧(中心、上、下)和瞄准右侧(中心、上、下)。您可以利用下表来确定推荐的起始关键帧和要移除的关键帧,以生成您想要的姿势。

  20. 每次都要 复制 Aim_Space_Ironsights 资源,然后根据下表信息创建剩余的姿势。

    动画名称 从关键帧开始 移除帧 1 移除帧 2
    Aim_LeftCenter 35 0 - 34 1 - 68
    Aim_LeftUp 40 0 - 39 1 - 63
    Aim_LeftDown 50 0 - 49 1 - 53
    Aim_RightCenter 65 0 - 64 1 - 38
    Aim_RightUp 71 0 - 70 1 - 32
    Aim_RightDown 81 0 - 80 1 - 32

    对于每个动画,请确保从推荐的 从关键帧开始 帧开始,然后 右键单击 擦除栏并 移除帧 1,接着再次 右键单击 擦除栏并 移除帧 2。每个动画都应该是单帧,而且 Character 按照其相应名称描述的方向瞄准。

    创建好所有动画后,您的 AimPoses 文件夹应该包含一些对应每个瞄准方向的姿势。

    AimOffset17.png

  21. AimPoses 文件夹中打开 Aim_Center 动画。

  22. 动画资源详细信息 窗口内的 Additive Settings 下,单击 No additive 选项,将其更改为 Mesh Space

    AimOffset18.png

    对于要与瞄准偏移兼容的动画,必须设置为使用 Mesh Space 附加动画类型。

  23. 单击 Reference Pose 选项,将其更改为 Selected animation frame

    AimOffset19.png

  24. 单击 None 下拉菜单,然后搜索并选择 Idle_Rifle_Ironsights 动画作为基础姿势。

    AimOffset20.png

  25. 资源浏览器 中,逐一打开每个瞄准姿势,然后重复第 22 至 24 步。

    AimOffset21.png

    确保将每个姿势的 Additive Anim Type 都设置为 Mesh Space,并指定 Idle_Rifle_Ironsights 基础姿势。

  26. 完成后,返回 内容浏览器,单击 Save All 按钮。

    AimOffset22.png

创建瞄准偏移

创建好姿势后,我们接下来将创建瞄准偏移资源,并设置姿势进行混合。

  1. 内容浏览器 中单击 Create 按钮,然后在 Animation 下选择 Aim Offset

    AimOffset23.png

  2. 选取骨架 窗口中,确保选择 Game/AnimStarterPack/Character 文件夹中的 HeroTPP_Skeleton

    AimOffset24.png

    将瞄准姿势命名为 Hero_AimOffset,然后打开。

  3. 动画资源详细信息 面板中的 Hero_AimOffset 内,从 Additive Settings 下单击 Preview Base Pose

  4. 在弹出窗口中,搜索并添加 Idle_Rifle_Ironsights 动画序列。

    AimOffset25.png

    我们开始向瞄准偏移添加瞄准姿势后,此动画序列将被用作要混合的预览基础姿势。

  5. Hero_AimOffset 窗口(中心窗口)中的 Parameters 下,按下图所示输入参数。

    AimOffset26.png

    X Axis Label 设置为 YawY Axis Label 设置为 Pitch,两个轴范围均设置为 -90 至 90,然后单击 Apply Parameter Changes

    有关 混合空间 运行方式的信息(瞄准偏移的依据),请参见混合空间

  6. 资源浏览器 中,搜索 Aim,然后将 Aim_Center 动画拖到图表中心位置,如下所示。

    AimOffset27.png

  7. Aim_CenterUp 拖到位置 1,将 Aim_CenterDown 拖到位置 2,如下例所示。

    AimOffset28.png

  8. Aim_LeftCenter 拖到位置 1,将 Aim_RightCenter 拖到位置 2,如下例所示。

    AimOffset29.png

    如果您此时在网格内移动鼠标,Character 将开始瞄准,并混合使用这些姿势。

  9. 添加 Aim_LeftUp (1)、Aim_RightUp (2)、Aim_LeftDown (3) 和 Aim_RightDown (4) 姿势,完成瞄准偏移。

    AimOffset30.png

    此时,瞄准偏移已完成设置,需要将它连接起来,以便在我们的 动画蓝图 内使用。

实施瞄准偏移

在本部分,我们将在 Character 的 动画蓝图 内实施瞄准偏移,所以,这也是动画集的一部分。

  1. 内容浏览器 内的 Game/AnimStarterPack/Character 下,打开 ASP_HeroTPP_AnimBlueprint

    AimOffset31.png

    这是一个分配给可玩 Character 的动画蓝图,它控制着 Character 的动画逻辑。

    有关 动画蓝图 运行方式的信息,请参见动画蓝图 文档。

  2. 在动画蓝图窗口中心偏下的位置,单击 MyBlueprint 选项卡,然后 双击 AnimGraph

    AimOffset32.png

    此时将打开 Anim Graph 选项卡,我们将在此选项卡中实施瞄准偏移。

  3. MyBlueprint 窗口中,单击 添加变量 按钮,创建新变量。

    AimOffset33.png

  4. 在右侧的 详细信息 面板中,将 Variable Name 更改为 PlayerAimYawVariable Type 更改为 Float

    AimOffset34.png

  5. MyBlueprint 窗口中,再次单击 添加变量 按钮,并将新变量命名为 PlayerAimPitch(也是 Float)。

  6. 单击 Asset Browser 选项卡,然后搜索 Hero,并将 Hero_AimOffset 拖到图表中。

    AimOffset35.png

  7. 单击 My Blueprint 选项卡,然后将 PlayerAimYaw 变量拖到 Hero_AimOffset 节点的 Yaw 上。

    AimOffset36.png

    再将 PlayerAimPitch 变量拖到 Hero_AimOffset 节点的 Pitch 上。

  8. Locomotion 姿势连接至 Hero_AimOffsetBase Pose,然后将生成的姿势连接至 Result

    AimOffset37.png

    此操作将选取 Locomotion 状态机中的任意姿势,然后在其上将 瞄准偏移 应用为最终姿势。

  9. 在窗口中心偏下的位置单击 MyBlueprint 选项卡,然后 双击 EventGraph,将其打开。

    AimOffset38.png

    此时将打开 Event Graph 选项卡,此选项卡用于根据游戏内发生的事件随时更新 Character 动画。

  10. EventGraph 选项卡内,找到图表中的 Sequence 节点。

    AimOffset39.png

    单击 Sequence 节点上的 Add pin 按钮。

    AimOffset40.png

  11. MyBlueprint 窗口,按住 Alt 并将 PlayerAimYaw 变量拖入图表。

    AimOffset41.png

    这样就可以创建 Set 节点,该节点用于获取玩家当前的偏航值,并确定瞄准偏移上的混合点。

  12. 按住 Alt 并拖入 PlayerAimPitch,然后将二者都连接至 Sequence 节点的 Then 2 针。

    AimOffset42.png

  13. Cast to ASP_Character 节点的 As ASP Character 针连出线来,然后搜索并添加 Get Control Rotation 节点。

    AimOffset43.png

  14. 重复上一步,但搜索并添加 Get Actor Rotation 节点。

    AimOffset44.png

  15. 在图表中 右键单击,搜索并添加 Delta (Rotator) 节点。

    AimOffset45.png

  16. Get Control Rotation 连接至 Delta(Rotator) 节点的 A,将 Get Actor Rotation 连接至 B

  17. 在图表中 右键单击,搜索并添加 RInterp To 节点。

    AimOffset46.png

  18. 在图表中**右键单击,搜索并添加 MakeRot**(实现旋转)节点。

    AimOffset47.png

  19. PlayerAimPitchPlayerAimYaw 变量 拖放MakeRot 节点的 Pitch/Yaw 上。

    AimOffset48.png

    按上图所示连接节点。

    这样就可以获得 PlayerAimPitchPlayerAimYaw 当前的值,然后流畅地过渡到玩家的实际俯仰/偏航动作。

  20. 移动 部分开始处,从 Event Blueprint Update AnimationDelta Time X 连出线来,并连接至 Promote to variable

    AimOffset49.png

    我们利用此操作将变量存储至增量时间,以便用于 RInterp 节点。

  21. 将变量命名为 Time,并按下图所示进行连接。

    AimOffset50.png

  22. Time 变量拖放到 RInterp To 节点的 DeltaTime 针上,并将 Interp Speed 设置为 15

    AimOffset51.png

    我们已经指定了参考时间值,而且设置了从玩家的旧俯仰/偏航位置移动到新位置的速度。

  23. RInterp To 节点的 Return Value 连出线来,并添加 Break Rot(打断旋转)节点。

    AimOffset52.png

  24. Pitch 连出线来,添加 Clamp Angle 节点。

    AimOffset53.png

    最小角度 设置为 -90最大角度 设置为 90

  25. 复制并粘贴 Clamp Angle 节点,将其连接至 Yaw,然后将二者连接至 PlayerAimYaw 和**PlayerAimPitch** 节点。

    AimOffset54.png

    通过瞄准偏移获取/使用玩家俯仰/偏航的逻辑已设置完毕,只差几步就可以完成了。

完成

在最后这部分,我们将更改默认闲置姿势,并更新 Character 蓝图,以便正确使用瞄准偏移。

  1. 继续上一部分的操作,单击 MyBlueprint 选项卡,然后**双击 Locomotion**,打开图表。

    AimOffset55.png

  2. 双击 运动 图表内的 Idle 状态。

    AimOffset56.png

  3. Idle_Rifle_Ironsights资源浏览器 拖入图表,并将其连接至 Result 针。

    AimOffset57.png

    您如果想稍后返回此处,可以先将 Play Idle_Rifle_Hip 保持原样。

  4. 编译保存,然后关闭动画蓝图。

  5. 内容浏览器 内的 Game/AnimStarterPack/Character 文件夹下,打开 ASP_Character 蓝图。

    AimOffset58.png

  6. Defaults 选项卡上,搜索 Rotation,然后取消选中 Use Controller Rotation Yaw 选项。

    AimOffset59.png

    这样可以防止 Character 自动转向控制器的偏航位置。

  7. 单击 Graph 选项卡,然后找到 Crouching 部分,用 C 键按键事件替换 InputAction Crouch 节点。

    AimOffset60.png

    这样可以移除窗口左上角编译按钮上的黄色警告标志,因为默认情况下,本项目没有蹲伏的动作映射,所以我们将用 C 按钮实现蹲伏(您可以随意使用任何按键事件实现此操作)。

  8. 编译保存,然后关闭蓝图

    在虚幻引擎 4.8 和更高版本中,您需要从场景中移除 ThirdPersonCharacter。在 编辑器视窗场景大纲视图 内找到 ThirdPersonCharacter,单击 ThirdPersonCharacter,然后按删除,即可完成。

    由于 ThirdPersonCharacter 会在场景内自动被占用,因此要完成此操作。

    从场景中移除 ThirdPersonCharacter 后,请务必 保存 项目。

  9. 在主编辑器工具栏中单击 开始,开始玩游戏。

在编辑器中玩游戏时,Character 将在静止时瞄准,然后随着鼠标移动作出反应,瞄向鼠标的方向。其中存在一些限制,当鼠标位于 Character 身后时,Character 不能转身面向后方,同样,当 Character 处于慢跑状态时,其身体会随鼠标移动的方向转动。

您可以查看使用附加动画 操作指南页面,了解如何将多个动画混合在一起,让 Character 朝一个方向瞄准并在该方向做射击动画,以及(or)让 Character 在沿一个方向移动或蹲伏的同时做射击动画,只需几个步骤即可解决这个问题。或者,您也可以查看骨骼网格体 Socket ,了解将武器放到 Character 手中让他们进行瞄准的示例。