六一的部落格


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




建模

  • 添加伤害源,派生自Actor,模拟榴弹爆炸瞬间
  • 绘制球体,使得伤害范围可视化
  • 对处在爆炸半径内的游戏角色持续造成伤害,伤害数值与游戏角色所在位置到球心的距离有关

创建伤害源


创建Dev/STUDevDamageActor

虚幻编辑器

  • Actor

  • 公有类



设置头文件搜索路径

C++

ShootThemUp: ShootThemUp.Build.cs

1PublicIncludePaths.AddRange(new string[] { "ShootThemUp/Public/Player", "ShootThemUp/Public/Components", "ShootThemUp/Public/Dev" });        

添加可视化组件,使得伤害源可变换

  1. 添加SceneComponent

    protected

    ShootThemUp: Dev/STUDevDamageActor.h
    1UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    2USceneComponent *SceneComponent;
  2. 初始化组件

    ShootThemUp: Dev/STUDevDamageActor.cpp
    1// 构造函数
    2SceneComponent = CreateDefaultSubobject<USceneComponent>("SceneComponent");
    3SetRootComponent(SceneComponent);

绘制球体,使得爆炸范围可视化

  1. 添加球体参数

    protected

    ShootThemUp: Dev/STUDevDamageActor.h

    -
    颜色 SphereColor
    半径 Radius
    1UPROPERTY(EditAnywhere)
    2float Radius = 300.0f;
    3
    4UPROPERTY(EditAnywhere)
    5FColor SphereColor = FColor::Red;
  2. 每帧绘制球体

    ShootThemUp: Dev/STUDevDamageActor.cpp

    1#include "DrawDebugHelpers.h"
    2
    3// Tick
    4DrawDebugSphere(GetWorld(),
    5                GetActorLocation(),
    6                Radius,
    7                24,
    8                SphereColor);

    使用了GetWorld,其声明和UWorld的定义在一处,而DrawDebugSphere的第一个参数类型为UWorld,不用包含Engine/World.h


对伤害范围内Actor造成半径伤害

  1. 添加半径伤害参数

    protected

    ShootThemUp: Dev/STUDevDamageActor.h

    -
    Damage 伤害数值特征
    DoFullDamage 半径伤害计算选项:为true,受到的伤害与到球心的距离有关;为false,使用简化模型,受到伤害值恒定
    1UPROPERTY(EditAnywhere)
    2float Damage = 10.0f;
    3
    4UPROPERTY(EditAnywhere)
    5bool DoFullDamage = false;
  2. 对伤害范围内Actor造成半径伤害

    ShootThemUp: Dev/STUDevDamageActor.cpp

     1#include "Engine/World.h"
     2#include "Kismet/GameplayStatics.h"
     3
     4// Tick
     5UGameplayStatics::ApplyRadialDamage(GetWorld(),
     6                                    Damage,
     7                                    GetActorLocation(),
     8                                    Radius,
     9                                    nullptr,
    10                                    {},
    11                                    this,
    12                                    nullptr,
    13                                    DoFullDamage);

    ApplyRadialDamage 的第一个参数类型为 UObject ,此时传入 UWorld ,需包含 UWorld 头文件


验证半径伤害数值

C++

定义日志宏,输出伤害值

ShootThemUp: Components/STUHealthComponent.cpp

1DEFINE_LOG_CATEGORY_STATIC(LogHealthComponent, All, All);
2
3// OnTakeAnyDamage
4UE_LOG(LogHealthComponent, Display, TEXT("Damage: %.0f"), Damage);

屏蔽STUBaseCharacter>Tick中调用TakeDamage

ShootThemUp: Player/STUBaseCharacter.cpp


在关卡中添加伤害源

虚幻编辑器


调整BP_STUBaseCharacter>CameraComponent位置

向上,向后



在关卡中添加STDevDamageActor

  1. 第一个伤害源: 使用默认设置,根据游戏角色到球心的距离计算伤害


  2. 第二个伤害源: 设置半径和颜色,处在伤害范围内受到伤害数值恒定(开销小)


  3. 调整 STDevDamageActor 的位置,效果图


    要求伤害源球心无阻隔


验证 DoFullDamage

  1. 处于蓝色球内,伤害值一致


  2. 处于红色球内,离球心越近,伤害值越大


    球心在空中,跳跃也会缩短到球心的距离


伤害球内的所有Actor都会受到伤害


模拟榴弹爆炸



建模

  • 添加伤害源,派生自Actor,模拟榴弹爆炸瞬间
  • 绘制球体,使得伤害范围可视化
  • 对处在爆炸半径内的游戏角色持续造成伤害,伤害数值与游戏角色所在位置到球心的距离有关

创建伤害源


创建Dev/STUDevDamageActor

虚幻编辑器

  • Actor

  • 公有类



设置头文件搜索路径

C++

ShootThemUp: ShootThemUp.Build.cs

1PublicIncludePaths.AddRange(new string[] { "ShootThemUp/Public/Player", "ShootThemUp/Public/Components", "ShootThemUp/Public/Dev" });        

添加可视化组件,使得伤害源可变换

  1. 添加SceneComponent

    protected

    ShootThemUp: Dev/STUDevDamageActor.h
    1UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    2USceneComponent *SceneComponent;
  2. 初始化组件

    ShootThemUp: Dev/STUDevDamageActor.cpp
    1// 构造函数
    2SceneComponent = CreateDefaultSubobject<USceneComponent>("SceneComponent");
    3SetRootComponent(SceneComponent);

绘制球体,使得爆炸范围可视化

  1. 添加球体参数

    protected

    ShootThemUp: Dev/STUDevDamageActor.h

    -
    颜色 SphereColor
    半径 Radius
    1UPROPERTY(EditAnywhere)
    2float Radius = 300.0f;
    3
    4UPROPERTY(EditAnywhere)
    5FColor SphereColor = FColor::Red;
  2. 每帧绘制球体

    ShootThemUp: Dev/STUDevDamageActor.cpp

    1#include "DrawDebugHelpers.h"
    2
    3// Tick
    4DrawDebugSphere(GetWorld(),
    5                GetActorLocation(),
    6                Radius,
    7                24,
    8                SphereColor);

    使用了GetWorld,其声明和UWorld的定义在一处,而DrawDebugSphere的第一个参数类型为UWorld,不用包含Engine/World.h


对伤害范围内Actor造成半径伤害

  1. 添加半径伤害参数

    protected

    ShootThemUp: Dev/STUDevDamageActor.h

    -
    Damage 伤害数值特征
    DoFullDamage 半径伤害计算选项:为true,受到的伤害与到球心的距离有关;为false,使用简化模型,受到伤害值恒定
    1UPROPERTY(EditAnywhere)
    2float Damage = 10.0f;
    3
    4UPROPERTY(EditAnywhere)
    5bool DoFullDamage = false;
  2. 对伤害范围内Actor造成半径伤害

    ShootThemUp: Dev/STUDevDamageActor.cpp

     1#include "Engine/World.h"
     2#include "Kismet/GameplayStatics.h"
     3
     4// Tick
     5UGameplayStatics::ApplyRadialDamage(GetWorld(),
     6                                    Damage,
     7                                    GetActorLocation(),
     8                                    Radius,
     9                                    nullptr,
    10                                    {},
    11                                    this,
    12                                    nullptr,
    13                                    DoFullDamage);

    ApplyRadialDamage 的第一个参数类型为 UObject ,此时传入 UWorld ,需包含 UWorld 头文件


验证半径伤害数值

C++

定义日志宏,输出伤害值

ShootThemUp: Components/STUHealthComponent.cpp

1DEFINE_LOG_CATEGORY_STATIC(LogHealthComponent, All, All);
2
3// OnTakeAnyDamage
4UE_LOG(LogHealthComponent, Display, TEXT("Damage: %.0f"), Damage);

屏蔽STUBaseCharacter>Tick中调用TakeDamage

ShootThemUp: Player/STUBaseCharacter.cpp


在关卡中添加伤害源

虚幻编辑器


调整BP_STUBaseCharacter>CameraComponent位置

向上,向后



在关卡中添加STDevDamageActor

  1. 第一个伤害源: 使用默认设置,根据游戏角色到球心的距离计算伤害


  2. 第二个伤害源: 设置半径和颜色,处在伤害范围内受到伤害数值恒定(开销小)


  3. 调整 STDevDamageActor 的位置,效果图


    要求伤害源球心无阻隔


验证 DoFullDamage

  1. 处于蓝色球内,伤害值一致


  2. 处于红色球内,离球心越近,伤害值越大


    球心在空中,跳跃也会缩短到球心的距离


伤害球内的所有Actor都会受到伤害