IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【UE5 C++基础 06】角色控制基础 -> 正文阅读

[游戏开发]【UE5 C++基础 06】角色控制基础

游戏模式 GameMode

游戏模式定义这些游戏的规则。这些规则包括游戏启动时将生成的默认Pawn。你需要设置规则生成你已经创建的玩家角色。

让新建的GameMode生效,需要在项目设置中的地图与模式,设置Default GameMode。

Default Pawn Class

默认的Pawn
由于Character是Pawn的子类,所以这里也可以设置Character
Character是比Pawn多了一些移动组件的子类。

角色控制

相机横向转动 APawn::AddControllerYawInput
相机纵向转动 APawn::AddControllerPitchInput
角色向前移动

void APlayerCharacter::MoveForward(float AxisValue)
{
    if ((Controller != nullptr) && (AxisValue != 0.0f))
    {
        // 找出向前方向
        const FRotator Rotation = Controller->GetControlRotation();
        const FRotator YawRotation(0, Rotation.Yaw, 0);

        // 获取向前矢量
        const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
        AddMovementInput(Direction, AxisValue);
    }
}

角色横向转动

void APlayerCharacter::MoveRight(float AxisValue)
{
    if ((Controller != nullptr) && (AxisValue != 0.0f))
    {
        // 找出向右方向
        const FRotator Rotation = Controller->GetControlRotation();
        const FRotator YawRotation(0, Rotation.Yaw, 0);

        // 获取向右矢量 
        const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);

        // 添加该方向动作
        AddMovementInput(Direction, AxisValue);
    }
}

角色跳跃 ACharacter::Jump ACharacter::StopJumping

混合空间

混合空间是一种资产,允许混合多个动画或姿势,方法是将其绘制到一维或二维图表中。然后,该图表可以在动画蓝图中进行引用,其中混合通过Gameplay输入或其他变量进行控制。通过使用混合空间,几乎所有类型的混合布局都可以用于你的动画。

先决条件

你的项目有一个 骨骼网格体(Skeletal Mesh) ,其中导入了各种方向性或类似 动画序列(Animation Sequences)

混合空间概述

混合空间是一种资产,你可以在其中沿图表上的各个点指定动画,称为 示例(samples) 。总体动画通过基于每个轴的输入值在图表上的点之间混合来计算。例如,可以创建一个在方向性移动和空闲动画之间混合的移动系统。

混合空间创建和类型

有不同类型的混合空间,它们在资产编辑器中或针对它们在动画蓝图中的使用方式提供了不同的功能。

以下混合空间类型可以通过点击"内容浏览器(Content Browser)"中的 添加(+)(Add (+)) 按钮并从 动画(Animation) 菜单进行选择来创建:

  • 瞄准偏移(Aim Offset)

  • 瞄准偏移1D(Aim Offset 1D)

  • 混合空间(Blend Space)

  • 混合空间1D(Blend Space 1D)

混合空间类型

常规混合空间是混合空间的基本种类,用于提供沿图表混合动画的所有主要功能。它们旨在作为基础层在动画蓝图中进行引用,次要动画将从中延续。

瞄准偏移类型

瞄准偏移是混合控件,旨在包含网格体空间叠加动画作为其示例。通常,这些用于创建武器或其他"看向"瞄准混合空间。瞄准偏移动画蓝图节点旨在随法线轴输入一起接收输入姿势

请参阅瞄准偏移页面,了解有关如何使用它们的更多信息。

角色使用瞄准偏移将武器瞄准鼠标或控制器的方向。 在动画过程中,瞄准偏移的结果与其他动作(如奔跑、行走、跳跃等)混合在一起,使角色从各个方向上看起来都很平滑。

瞄准偏移背后的关键概念是,它们被设计成与现有动画进行额外混合。因此,打个比方,如果您使用瞄准偏移来让角色瞄准一个武器,您会想要确保角色上的其他运动不会妨碍那个附加运动。换句话说,您的奔跑、站立、跳跃等操作应该具有相对刚性的手臂,这样它们就可以通过瞄准偏移进行额外的控制。

在很多方面,瞄准偏移就像一个混合空间。因此,在使用混合空间之前,最好先对它们有一个透彻的了解。

1D

混合空间和瞄准偏移都还支持单轴(1D)变体。通常,这些混合空间在你只需要单个轴混合时使用。对于混合空间1D或瞄准偏移1D的情况,图表仅提供水平轴。

尽管1D混合空间可用,但普通2D图表也可用于一维方式,方法是仅将单个轴用于你的示例放置。这样一来,你可以根据需要将混合空间从1D扩展到2D。

混合空间设置

创建并打开你的混合空间类型后,请继续进行以下设置。

定义轴名称和范围

在大部分情况下,你需要定义混合空间中使用的轴的名称和值范围。为此,请导航至 资产细节(Asset Details) 面板,并更改位于 轴设置(Axis Settings) 类别中的以下属性:

  • 名称(Name)

  • 最小轴值(Minimum Axis Value)

  • 最大轴值(Maximum Axis Value)

根据混合空间的类型,如果你要创建瞄准偏移,并且希望网格匹配旋转值,那么你可能需要使用不同的值比例,例如 -90 到 90 或 -180 到 180。

将动画添加到图表

你可以将动画从 资产浏览器(Asset Browser)内容浏览器(Content Browser) 拖到图表中,以向图表填充动画。按住 Shift 键将使动画对齐到网格点,这对于对齐很有用。根据你要创建的混合空间种类,这些可以是循环动画或静态姿势。

由于1D混合空间只有一个轴用于输入,你只能沿该单个轴应用动画。

在这个例子中,垂直和水平轴分别映射到方向和速度。然后,将设置多个基于周期的动画以基于这些输入的值进行相应混合,生成你在游戏内看到的最终姿势。

在动画蓝图中引用

完成图表后,你可以引用和操控动画蓝图中的混合空间。要添加混合空间,请右键点击 AnimGraph 并找到你的混合空间。你还可以从 内容浏览器(Content Browser) 将其拖入图表中。这样做会创建引用该资产的 混合空间播放器

请参阅使用混合空间页面,了解有关使用动画蓝图中的混合空间的更多信息。

示例

移动混合空间

速度0-250为走路,250-500为跑,500-1000为疾跑
方向-180向后,方向-90向左,方向0向前,方向90向右,方向180向后

  1. 内容浏览器(Content Browser) 中,点击 (添加/导入)Add/Import > 动画(Animation) > 混合空间(BlendSpace),当提示选择骨架时,选择 UE4_Mannequin_Skeleton,然后将你的混合空间命名为 Locomotion_BS
    在这里插入图片描述
  2. 双击打开 Locomotion_BS 混合空间。在 资产详情选项卡(Asset Details tab) 中,导航至 轴设置(Axis Settings) 类别,然后选择 水平轴(Horizontal Axis)垂直轴(Vertical Axis) 旁边的箭头,查看更多变量详情。
    在这里插入图片描述
  3. 水平轴设置(Horizontal Axis settings) 中,将 名称(Name) 变量更改为 方向(Direction),然后将 最小轴值(Minimum Axis Value) 设置为 -180,将 最大轴值(Maximum Axis Value) 设置为 180
    在这里插入图片描述
  4. 垂直轴设置(Vertical Axis Settings) 中,将 名称(Name) 变量更改为 速度(Speed),然后将 最大轴值(Maximum Axis Value) 设置为 1000
    在这里插入图片描述
  5. 编译(Compile)保存(Save)
    在这里插入图片描述

UE5 中没有看到编译按钮,直接使用保存按钮也可

  1. 导航至 资产浏览器(Asset Browser),然后在过滤器搜索栏中,输入 Idle_Rifle_Hip,然后将 Idle_Rifle_Hip 资产拖放到 方向0.0速度0.0 的 混合空间。
    在这里插入图片描述
  2. 重复前一步骤,插入 Idle_Rifle_Hip 资产到以下值的混合空间:
  • 方向180、速度0。

  • 方向90、速度0。

  • 方向-90、速度0。

  • 方向-180、速度0。

  1. 资产浏览器(Asset Browser) 选项卡的 过滤器(Filters) 搜索栏中,输入 Walk_Fwd_Rifle_Ironsights,然后将 Walk_Fwd_Rifle_Ironsights 资产拖放到 方向0.0速度250 的 混合空间。

  2. 然后,在 资产浏览器(Asset Browser) 选项卡的 过滤器(Filters) 搜索栏中,输入 Walk_Lt_Rifle_Ironsights,然后将 Walk_Lt_Rifle_Ironsights 资产拖放到 方向-90速度250 的 混合空间。

  3. 资产浏览器选项卡过滤器(Asset Browser tab Filters) 搜索栏中,输入 Walk_Rt_Rifle_Ironsights,然后将 Walk_Rt_Rifle_Ironsights 资产拖放到 方向90速度250 的 混合空间。

  4. 资产浏览器选项卡过滤器(Asset Browser tab Filters) 搜索栏中,输入 Walk_Bwd_Rifle_Ironsights,然后将 Walk_Bwd_Rifle_Ironsights 资产拖放到 方向180速度250 的 混合空间,然后再次将其拖放到 方向-180速度250

  5. 资产浏览器(Asset Browser) 选项卡的 过滤器(Filters) 搜索栏中,输入 Jog_Fwd_Rifle,然后将 Jog_Fwd_Rifle 资产拖放到 方向0.0速度500混合空间

  6. 导航至 资产浏览器(Asset Browser),然后在过滤器搜索栏中,输入 Jog_Lt_Rifle,然后将 Jog_Lt_Rifle 资产拖放到 方向-90速度500混合空间

  7. 导航至 资产浏览器(Asset Browser),然后在过滤器搜索栏中,输入 Jog_Rt_Rifle,然后将 Jog_Rt_Rifle 资产拖放到 方向90速度500 的 混合空间。

  8. 在资产浏览器搜索栏过滤器中,输入 Jog_Bwd_Rifle_Ironsights,然后将 Jog_Bwd_Rifle_Ironsights 资产拖放到 方向180速度500 的 混合空间,然后将额外的 Jog_Bwd_Rifle_Ironsights 拖放到 方向-180速度500混合空间

UE5中的这个动画资产,更名为Jog_Bwd_Rifle

  1. 导航到资产浏览器完成你的混合空间,搜索并选择 Sprint_Fwd_Rifle_Ironsights,然后将 Sprint_Fwd_Rifle_Ironsights 资产拖放到 方向0速度1000混合空间

  2. 编译(Compile)保存(Save)

UE5 中没有看到编译按钮,直接使用保存按钮也可

蹲伏移动混合空间

  1. 水平轴设置(Horizontal Axis settings) 中,将 名称(Name) 变量更改为 方向(Direction),然后将 最小轴值(Minimum Axis Value) 设置为 -180,将 最大轴值(Maximum Axis Value) 设置为 180

  2. 垂直轴设置(Vertical Axis Settings) 中,将 名称(Name) 变量更改为 速度(Speed),然后将 最大轴值(Maximum Axis Value) 设置为 300

  3. 重复"创建移动混合空间"部分的上述步骤,将你的资产放入设置了下述值的混合空间。
    在这里插入图片描述

  4. 保存并编译LocomotionCrouch_BS
    在这里插入图片描述

动画蓝图

你将需要 动画蓝图,它将根据玩家的当前动作确定要播放的角色动画。此外,你将需要设置 状态机(State Machine) 以便创建 行走(Walk)蹲伏(Crouch) 状态,然后设置状态之间的过渡。

  1. 内容浏览器(Content Browser) 中,点击 添加/导入(Add/Import)>动画(Animation)>动画蓝图(Animation Blueprint),当提示选择骨架时,选择 UE4_Mannequin_Skeleton,然后将你的动画蓝图命名为 PlayerCharacter_AB

  2. 双击 PlayerCharacter_AB 打开动画蓝图。在 我的蓝图选项卡(My Blueprint tab) 中,导航至 变量(Variables) 类别 ,并选择旁边的 + 号,创建名为 Is CrouchedIs Jumping 的 两个 布尔 变量。

  3. 点击 事件图表(Event Graph) 选项卡,然后从 Try Get Pawn Owner 节点的 返回值引脚(Return Value pin) 拖移,然后从下拉菜单搜索并选择 Cast to BP_PlayerCharacter

  4. Cast to BP_PlayerCharacter 节点的 BP_PlayerCharacter返回时(As BP_PlayerCharacter return) 引脚拖移,然后搜索并选择 Get Is Crouched

  5. 导航至 我的蓝图选项卡(My Blueprint tab),然后从 变量类别(variables category)Is Crouched 变量拖放到 Get Is Crouched 节点的 返回引脚

  6. 投射到BP_PlayerCharacter输出执行引脚 拖移,将其连接到 Set Is Crouched 节点的 输入执行引脚

  7. Cast to BP_PlayerCharacter 节点的 BP_PlayerCharacter返回时(As BP_PlayerCharacter return) 引脚拖移,然后从 全部操作(All Actions) 下拉菜单搜索并选择 Get Pressed Jump

  8. MyBlueprint 选项卡,导航至 变量类别(variables category),然后将 Is Jumping 变量拖放到 Get Pressed Jump 节点的 返回引脚

  9. Set Is Crouched 节点的 输出执行引脚 拖移,将其连接到 Set Is Jumping 节点的 输入执行引脚

  10. 编译(Compile)保存(Save) PlayerCharacter_AB 动画蓝图。

  11. 变量类别(Variables category) 选择旁边的 + 号,创建名为 速度(Speed)方向(Direction) 的两个 浮点变量

  12. Cast to BP_PlayerCharacter 节点的 BP_PlayerCharacter返回时(As BP_PlayerCharacter return) 引脚拖移,然后 启用 上下文相关 框,搜索并选择 Get Velocity

  13. Get Velocity 节点的 返回值(Return Value) 引脚拖移,然后从 操作(Actions) 下拉菜单,搜索并选择 Vector Length

  14. 我的蓝图选项卡(My Blueprint tab) 中,将 速度(Speed) 变量拖放到 Vector Length 节点的 矢量返回值(vector Return Value) 引脚。

  15. 然后,将 Set Is Jumping 节点的 执行输出引脚 连接到 Set Speed 节点的 执行输入引脚

  16. 从 Cast to BP_PlayerCharacter 节点的 BP_PlayerCharacter返回时 引脚拖移,然后搜索并选择 Get Actor Rotation。

  17. 从 GetActorRotation 节点的 旋转体返回值(rotator return value) 引脚拖移,然后从 操作(Actions) 下拉菜单,搜索并选择 Calculate Direction。

  18. 然后,从 Get Velocity 节点的 矢量返回值引脚(vector Return Value pin) 拖移,将其插入到 Calculate Direction 节点的 速度输入引脚(Velocity input pin)。

  19. 从 我的蓝图(My Blueprint) 选项卡,点击拖放 方向(Direction) 变量,并将其拖到 Calculate Direction 节点的 浮点返回值引脚(float Return Value pin)。

  20. 然后,将 Set Speed 节点的 执行输出引脚 连接到 Set Speed 节点的 执行输入引脚。

  21. 从 Event Blueprint Update Animation 节点的 执行输出引脚 拖移,并将其连接到 Cast To BP_PlayerCharacter 节点。

  22. 编译(Compile) 并 保存(Save) PlayerCharacter_AB 动画蓝图。

在这里插入图片描述

动画状态机

状态机 可以用图形显示骨骼网格体的动画组织成一系列 状态。这些状态会在 过渡规则 的控制下从一种状态过渡到另一种状态。你将使用布尔变量在前面分段中创建的不同运动混合空间之间过渡。

  1. PlayerCharacter_AB 动画蓝图中,导航至 动画图表(Anim Graph)

AnimGraph用于评估骨骼网格体的最终姿势。

  1. 右键点击 AnimGraph,并从 操作(Actions) 下拉菜单搜索并选择 添加新的状态机(Add New State Machine)

  2. 将State Machine节点重命名为 Locomotion,双击节点打开图表。从 条目(Entry) 引脚拖移,并从 操作(Actions) 下拉菜单中选择 添加状态(Add State)

  3. 将新状态命名为 动作(Movement),然后双击打开 动作状态节点(Movement State Node)。导航至 资产浏览器(Asset browser),搜索 Locomotion_BS,然后点击并将其拖放到图表中。

  4. 我的蓝图选项卡(My Blueprint tab),点击并将 速度浮点变量 拖放到混合空间的 速度垂直轴

  5. 导航回 我的蓝图选项卡(My Blueprint tab) ,点击并将 方向浮点变量 拖放到混合空间的 方向水平轴

  6. 动画姿势输出引脚(Animation Pose output pin) 连接到 Output Animation Pose 节点的 动画姿势结果引脚(Animation Pose Result pin)

  7. 编译(Compile)保存(Save)

  8. 导航回 移动状态机,然后点击并拖放 Movement state节点,以便创建名为 蹲伏动作(Crouch Movement) 的新动画状态。

  9. 双击 Transition rule节点打开 动画图表(Anim Graph)

  10. 我的蓝图选项卡(My Blueprint Tab) ,导航至 变量类别(variables category),并将 Is Crouched布尔 拖放到 Result节点Can Enter Transition输入引脚

  11. 导航回 移动状态机图表,双击 蹲伏动作(Crouch Movement) 状态打开动画图表。在 资产浏览器(Asset browser) 中搜索 LocomotionCrouch_BS,点击并将其拖入图表。

  12. 我的蓝图选项卡(My Blueprint Tab) ,导航至 变量类别(variables category),并将 速度(Speed)方向(Direction) 浮点变量拖放到其在 LocomotionCrouch_BS 上的各自引脚,然后将 LocomotionCrouch_BS 动画姿势 连接到 输出动画姿势引脚(Output Animation Pose Result pin)

  13. 编译(Compile)保存(Save) 动画蓝图。

  14. 导航回 Locomotion AnimGraph ,然后点击并拖移 CrouchMovement 动画状态,并将其连接到 动作动画状态(Movement Animation State)

  15. 双击 Transition rule节点 打开 动画图表(Anim Graph)。

  16. 从 我的蓝图选项卡(My Blueprints tab),点击 Is Crouched 布尔变量并将其拖放到动画图表,选择 Get Is Crouched,然后从其 输出引脚 拖移,在操作下拉菜单中,搜索并选择 NOT Boolean。

  17. 然后,将 NOT Boolean的返回引脚 连接到 Can Enter Transition输入引脚。

  18. 编译(Compile) 并 保存(Save)。

  19. 导航回 动画图表(Anim Graph),然后点击并从 动作动画状态 拖移,选择 添加状态(Add State)。

  20. 将此 动画状态 重命名为 跳跃(Jump),然后双击打开其动画图表。导航至 资产浏览器(Asset browser),搜索 Jump_From_Jog,然后并将其拖放到图表中。

  21. 将 Play Jump_From_Jog 动画姿势连接到 输出动画姿势结果(Output Animation Pose Result) 引脚,完成跳跃动画状态。

  22. 导航回 移动动画图表(Locomotion Anim Graph),然后双击 Movement to Jump Transition rule节点 打开 动画图表(Anim Graph)。

  23. 在 过渡规则动画图表(Transition Rule Anim Graph) 中,导航至 我的蓝图选项卡(My Blueprints tab),将 Is Jumping 布尔变量拖放到 结果节点的Can Enter Transition输入引脚 。

  24. 导航回 移动动画图表(Locomotion Anim Graph),然后点击并拖移 Jump anim节点 和 创建过渡 到 Movement Anim Graph节点。

  25. 双击 Jump to Movement Transition rule节点* 打开 动画图表(Anim Graph)

  26. 从 我的蓝图选项卡(My Blueprints tab),点击 Is Crouched 和 Is Jumping 布尔变量并拖放到 动画图表(Anim Graph),然后拖移每个输出引脚,并从操作下拉菜单搜索和选择 NOT Boolean。

  27. 拖移 NOT Boolean输出引脚,搜索并选择 AND Boolean。

  28. 将 Is Crouched 和 Is Jumping NOT Boolean 节点输出引脚连接到 AND Boolean节点的输入引脚,然后将 AND boolean的输出引脚 连接到 Result节点的Can Enter Transition输入引脚。

  29. 导航回 移动动画图表(Locomotion Anim Graph),然后点击并拖移 Crouch节点 和 创建过渡 到 Jump节点。

  30. 双击 Crouch Movement to Jump Transition rule 节点打开 动画图表(Anim Graph)。

  31. 在 蹲伏动作到跳跃过渡规则(CrouchMovement to Jump transition rule) 动画图表中,导航至 我的蓝图选项卡(My Blueprints tab) ,然后点击并将 Is Jumping布尔变量 拖放到 Result节点的Can Enter Transition输入引脚。

  32. 导航回 移动动画图表(Locomotion Anim Graph),然后拖移 Jump 节点和 创建过渡 到 CrouchMovement节点。

  33. 双击 Jump to Crouch Movement Transition rule 节点,打开 动画图表(Anim Graph)。

  34. 从 我的蓝图选项卡(My Blueprint tab) 点击 Is Crouched 和 Is Jumping 变量并拖放到 动画图表(Anim Graph)。

  35. 从 Is Jumping Boolean输出引脚 拖移,并从操作下拉菜单搜索和选择 NOT Boolean,然后从 Is Crouched布尔输出引脚 拖移,并搜索和选择 AND Boolean。 将 Is Jumping NOT Boolean输出引脚 连接到 AND Boolean输入引脚,然后将 AND Boolean输出引脚 连接到 Can Enter Transition Result引脚,完成此过渡规则。

  36. 已完成的 Locomotion AnimGraph 将如下图所示。

  37. 导航至 AnimGraph,并将 移动姿势输出引脚(Locomotion Pose Output pin) 连接到 输出姿势结果引脚(Output Pose Result pin)。

  38. 编译(Compile) 并 保存(Save)。

  39. 从 内容浏览器(Content Browser) 双击 Bp_PlayerCharacter,打开 类默认值,然后在 组件(Components) 选项卡中,选择 网格体组件(Mesh component),然后导航至 细节面板动画类别,在 动画类变量下拉菜单中,搜索并选择 PlayerCharacter_AB。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 11:07:46  更:2022-07-03 11:08:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:54:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码