模拟榴弹爆炸
2023年6月11日 2024年1月11日
建模
- 添加伤害源,派生自Actor,模拟榴弹爆炸瞬间
- 绘制球体,使得伤害范围可视化
- 对处在爆炸半径内的游戏角色持续造成伤害,伤害数值与游戏角色所在位置到球心的距离有关
创建伤害源
创建Dev/STUDevDamageActor
虚幻编辑器
-
Actor
-
公有类
设置头文件搜索路径
C++
ShootThemUp: ShootThemUp.Build.cs
1PublicIncludePaths.AddRange(new string[] { "ShootThemUp/Public/Player", "ShootThemUp/Public/Components", "ShootThemUp/Public/Dev" });
添加可视化组件,使得伤害源可变换
- 添加SceneComponent
protected
ShootThemUp: Dev/STUDevDamageActor.h
1UPROPERTY(VisibleAnywhere, BlueprintReadWrite) 2USceneComponent *SceneComponent;
- 初始化组件
ShootThemUp: Dev/STUDevDamageActor.cpp
1// 构造函数 2SceneComponent = CreateDefaultSubobject<USceneComponent>("SceneComponent"); 3SetRootComponent(SceneComponent);
绘制球体,使得爆炸范围可视化
-
添加球体参数
protected
ShootThemUp: Dev/STUDevDamageActor.h
- 颜色 SphereColor 半径 Radius 1UPROPERTY(EditAnywhere) 2float Radius = 300.0f; 3 4UPROPERTY(EditAnywhere) 5FColor SphereColor = FColor::Red;
-
每帧绘制球体
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造成半径伤害
-
添加半径伤害参数
protected
ShootThemUp: Dev/STUDevDamageActor.h
- Damage 伤害数值特征 DoFullDamage 半径伤害计算选项:为true,受到的伤害与到球心的距离有关;为false,使用简化模型,受到伤害值恒定 1UPROPERTY(EditAnywhere) 2float Damage = 10.0f; 3 4UPROPERTY(EditAnywhere) 5bool DoFullDamage = false;
-
对伤害范围内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
-
第一个伤害源: 使用默认设置,根据游戏角色到球心的距离计算伤害
-
第二个伤害源: 设置半径和颜色,处在伤害范围内受到伤害数值恒定(开销小)
-
调整
STDevDamageActor
的位置,效果图要求伤害源球心无阻隔
验证 DoFullDamage
-
处于蓝色球内,伤害值一致
-
处于红色球内,离球心越近,伤害值越大
球心在空中,跳跃也会缩短到球心的距离