六一的部落格


关关难过关关过,前路漫漫亦灿灿。




概览


状态机

State Machine

  • 定义多个状态,每个状态对应一个动画
  • 在一个动画蓝图中管理多个状态,并定义状态之间的迁移条件

ACharacter::IsFalling

  • 当Character在空中时返回true,Character落地时返回false

绑定跳跃键位

虚幻编辑器

项目设置 > Engine > Input

动作映射

函数描述 键位
Jump SpaceBar



实现跳跃逻辑

C++

- 回调函数签名
BindAction void handler()
函数描述 回调函数
Jump Jump 回调函数由虚幻引擎提供,按下时触发

绑定函数描述和回调函数

ShootThemUp: Player/STUBaseCharacter.cpp

1// SetupPlayerInputComponent
2PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ASTUBaseCharacter::Jump);

使用状态机实现跳跃动画

虚幻编辑器


实现跳跃动画

ABP_BaseCharacter


添加状态机, 将其作为OutPose的输入

AnimGraph

  1. 添加 状态机 ,命名为 Locomotion



  2. Locomotion 作为 OutputPose 的输入



状态机说明

  • 跳跃动画资产
    -
    JumpStart 跳起
    JumpLoop 在空中
    JumpEnd 落地
  • 状态
    -
    Walk
    JumpStart
    JumpLoop
    JumpEnd
  • 状态迁移
    -
    Walk > JumpStart 游戏角色在空中
    JumpStart > JumpLoop JumpStart动画播放结束
    JumpLoop > JumpEnd 游戏角色落地
    JumpEnd > Walk JumpEnd动画播放结束

实现状态机

  • 双击Locomotion,进入状态机


    仅一个入口 Entry

  • 移植Walk状态

    1. Locomotion 添加 State ,命名为 Walk ,使 Entry 指向



    2. 双击 Walk


    3. 将OutputPose之前的输入, Velocity + BS_Locomotion_Walk_1D 封装到 Walk 状态(剪切), 作为其 OutputAnimationPose 的输入


      至此, Character 的运动动画和上一小节一致

  • 实现跳跃状态

    • 添加布尔型变量IsFalling

      上一小节中,变量 Velocity 横跨 ABP_BaseCharacterEventGraphAnimGraph ,这里,布尔类型变量 IsFalling 也一样

      EventGraph 设置变量值,在 AnimGraph 中使用变量

    • 使用ACharacter::IsFalling设置变量IsFalling

      EventGraph

      • 将Pawn转换为Character

        1. 接着设置Velocity, 将Pawn转换为Character

          不能同时从 EventBlueprintUpdateAnimation 出发, SetVelocity 之后,执行转换

        2. 双击 TryGetPawnOwnerCastToCharacter 连线上的一点,创建Bezier曲线,排线更易整理


      • 对ACharacter::CharacterMovement调用ACharacter::IsFalling

        1. 接着CastToCharacter, 设置IsFalling

        2. CaseToCharacter > AsCharacterIsFalling > Target ,自动添加提取数据成员; IsFalling 函数的返回类型是布尔,作为 SetIsFalling 的输入


      • 完整EventGraph


    • 实现状态机

      1. 回到 Locomotion

      2. AssetBrowserJump 的三个动画拖入 Locomotion

        动画自动被封装为 State ,和之前 AddState ,再将动画作为状态输入达到的效果一样


      3. 添加状态迁移路径


      4. 添加状态迁移条件

        状态迁移 触发条件
        Walk > JumpStart 游戏角色在空中 ACharacter::IsFalling返回true
        JumpStart > JumpLoop JumpStart动画播放结束 TimeRemaining < 0.1
        JumpLoop > JumpEnd 游戏角色落地 ACharacter::IsFalling返回false
        JumpEnd > Walk JumpEnd动画播放结束 TimeRemaining < 0.1
        • 双击转换图标,即可为状态迁移添加迁移条件

          Walk > JumpStart 举例


        • Walk > JumpStart 迁移条件:变量 IsFallingtrue


        • JumpStart > JumpLoop 迁移条件: JumpStart 动画将近结束



        • JumpLoop > JumpEnd 迁移条件:变量 IsFallingfalse



        • JumpEnd > Walk 迁移条件: JumpEnd 将近结束


      5. 设置 State 输入动画是否循环播放

        -
        BS_Locomotion_Walk_1D 循环播放
        JumpStart 播放一次
        JumpLoop 循环播放
        JumpEnd 播放一次

        JumpStart 状态举例: 选中JumpStart动画 > Details > Settings > LoopAnimation 为true


        如此设置还可修复Character跳跃时的卡顿


添加楼梯,查看Jump三阶段是否正常显示

  1. 添加楼梯

    PlaceActors > Geometry > LinearStair


  2. 设置阶数

    选中LinearStairBrush > Details > BrushSettings > NumSteps


  3. 将楼梯移动到合适位置

  4. 游戏角色从楼梯跳到平面时,循环 JumpLoop

  5. 跑步时跳跃,落地后会平滑一段距离


跳跃时Z方向速度

BP_STUBaseCharacter

JumpZVelocity不宜过大, 不然 JumpStart 动画播放结束,速度却未减为0,此时Character还在上升,却在播放 JumpLoop

-
Vz > 0 JumpStart 该过程应 近似 JumpStart 播放时长
Vz <= 0 JumpLoop 从临界点落下
Vz = 0 JumpEnd



实现游戏角色跳跃



概览


状态机

State Machine

  • 定义多个状态,每个状态对应一个动画
  • 在一个动画蓝图中管理多个状态,并定义状态之间的迁移条件

ACharacter::IsFalling

  • 当Character在空中时返回true,Character落地时返回false

绑定跳跃键位

虚幻编辑器

项目设置 > Engine > Input

动作映射

函数描述 键位
Jump SpaceBar



实现跳跃逻辑

C++

- 回调函数签名
BindAction void handler()
函数描述 回调函数
Jump Jump 回调函数由虚幻引擎提供,按下时触发

绑定函数描述和回调函数

ShootThemUp: Player/STUBaseCharacter.cpp

1// SetupPlayerInputComponent
2PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ASTUBaseCharacter::Jump);

使用状态机实现跳跃动画

虚幻编辑器


实现跳跃动画

ABP_BaseCharacter


添加状态机, 将其作为OutPose的输入

AnimGraph

  1. 添加 状态机 ,命名为 Locomotion



  2. Locomotion 作为 OutputPose 的输入



状态机说明

  • 跳跃动画资产
    -
    JumpStart 跳起
    JumpLoop 在空中
    JumpEnd 落地
  • 状态
    -
    Walk
    JumpStart
    JumpLoop
    JumpEnd
  • 状态迁移
    -
    Walk > JumpStart 游戏角色在空中
    JumpStart > JumpLoop JumpStart动画播放结束
    JumpLoop > JumpEnd 游戏角色落地
    JumpEnd > Walk JumpEnd动画播放结束

实现状态机

  • 双击Locomotion,进入状态机


    仅一个入口 Entry

  • 移植Walk状态

    1. Locomotion 添加 State ,命名为 Walk ,使 Entry 指向



    2. 双击 Walk


    3. 将OutputPose之前的输入, Velocity + BS_Locomotion_Walk_1D 封装到 Walk 状态(剪切), 作为其 OutputAnimationPose 的输入


      至此, Character 的运动动画和上一小节一致

  • 实现跳跃状态

    • 添加布尔型变量IsFalling

      上一小节中,变量 Velocity 横跨 ABP_BaseCharacterEventGraphAnimGraph ,这里,布尔类型变量 IsFalling 也一样

      EventGraph 设置变量值,在 AnimGraph 中使用变量

    • 使用ACharacter::IsFalling设置变量IsFalling

      EventGraph

      • 将Pawn转换为Character

        1. 接着设置Velocity, 将Pawn转换为Character

          不能同时从 EventBlueprintUpdateAnimation 出发, SetVelocity 之后,执行转换

        2. 双击 TryGetPawnOwnerCastToCharacter 连线上的一点,创建Bezier曲线,排线更易整理


      • 对ACharacter::CharacterMovement调用ACharacter::IsFalling

        1. 接着CastToCharacter, 设置IsFalling

        2. CaseToCharacter > AsCharacterIsFalling > Target ,自动添加提取数据成员; IsFalling 函数的返回类型是布尔,作为 SetIsFalling 的输入


      • 完整EventGraph


    • 实现状态机

      1. 回到 Locomotion

      2. AssetBrowserJump 的三个动画拖入 Locomotion

        动画自动被封装为 State ,和之前 AddState ,再将动画作为状态输入达到的效果一样


      3. 添加状态迁移路径


      4. 添加状态迁移条件

        状态迁移 触发条件
        Walk > JumpStart 游戏角色在空中 ACharacter::IsFalling返回true
        JumpStart > JumpLoop JumpStart动画播放结束 TimeRemaining < 0.1
        JumpLoop > JumpEnd 游戏角色落地 ACharacter::IsFalling返回false
        JumpEnd > Walk JumpEnd动画播放结束 TimeRemaining < 0.1
        • 双击转换图标,即可为状态迁移添加迁移条件

          Walk > JumpStart 举例


        • Walk > JumpStart 迁移条件:变量 IsFallingtrue


        • JumpStart > JumpLoop 迁移条件: JumpStart 动画将近结束



        • JumpLoop > JumpEnd 迁移条件:变量 IsFallingfalse



        • JumpEnd > Walk 迁移条件: JumpEnd 将近结束


      5. 设置 State 输入动画是否循环播放

        -
        BS_Locomotion_Walk_1D 循环播放
        JumpStart 播放一次
        JumpLoop 循环播放
        JumpEnd 播放一次

        JumpStart 状态举例: 选中JumpStart动画 > Details > Settings > LoopAnimation 为true


        如此设置还可修复Character跳跃时的卡顿


添加楼梯,查看Jump三阶段是否正常显示

  1. 添加楼梯

    PlaceActors > Geometry > LinearStair


  2. 设置阶数

    选中LinearStairBrush > Details > BrushSettings > NumSteps


  3. 将楼梯移动到合适位置

  4. 游戏角色从楼梯跳到平面时,循环 JumpLoop

  5. 跑步时跳跃,落地后会平滑一段距离


跳跃时Z方向速度

BP_STUBaseCharacter

JumpZVelocity不宜过大, 不然 JumpStart 动画播放结束,速度却未减为0,此时Character还在上升,却在播放 JumpLoop

-
Vz > 0 JumpStart 该过程应 近似 JumpStart 播放时长
Vz <= 0 JumpLoop 从临界点落下
Vz = 0 JumpEnd