可能很多初学者如果想知道UE4的这种伤害系统如何使用起来会有点迷茫。

我自己做了demo给大家参考下。

首先要有个子弹类。

.h代码如下

 1 UCLASS()
 2 class SNVRCLAYSHOOTING_API AProjectile : public AActor
 3 {
 4     GENERATED_BODY()
 5
 6 public:
 7     // Sets default values for this actor's properties
 8     AProjectile();
 9
10     UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Projectile")
11         UStaticMeshComponent* ProjectileMesh;
12
13     UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Projectile")
14         UParticleSystemComponent* LaunchParticle;    //烟火,开枪时
15
16     UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Projectile")
17         UProjectileMovementComponent *ProjectileMovementComponent = nullptr;
18
19 protected:
20     // Called when the game starts or when spawned
21     virtual void BeginPlay() override;
22
23     UFUNCTION()
24         void OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit);
25
26 public:
27     // Called every frame
28     virtual void Tick(float DeltaTime) override;
29
30     UFUNCTION(BlueprintCallable, Category = "Projectile_Fun")
31         void LaunchProjectile(FVector Speed);
32
33 };

View Code

.cpp代码如下

 1 AProjectile::AProjectile()
 2 {
 3      // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
 4     PrimaryActorTick.bCanEverTick = true;
 5
 6     ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(FName("ProjectileMovement"));    //生成组件
 7     ProjectileMovementComponent->bAutoActivate = false;        //自动飞行调成false
 8
 9     ProjectileMesh = CreateDefaultSubobject<UStaticMeshComponent>(FName("ProjectileMesh"));
10     RootComponent = ProjectileMesh;
11     ProjectileMesh->SetNotifyRigidBodyCollision(true);
12     ProjectileMesh->SetVisibility(true);
13
14     LaunchParticle = CreateDefaultSubobject<UParticleSystemComponent>(FName("LaunchParticle"));
15     LaunchParticle->SetupAttachment(ProjectileMesh);    //将粒子效果绑定在根结点上(即ProjectileMesh)
16     LaunchParticle->SetAutoActivate(true);                //创建好就启动
17
18     ProjectileMesh->OnComponentHit.AddDynamic(this, &AProjectile::OnHit);
19
20     InitialLifeSpan = 5.0f;
21 }
22
23 // Called when the game starts or when spawned
24 void AProjectile::BeginPlay()
25 {
26     Super::BeginPlay();
27
28 }
29
30 // Called every frame
31 void AProjectile::Tick(float DeltaTime)
32 {
33     Super::Tick(DeltaTime);
34
35 }
36 void AProjectile::LaunchProjectile(FVector Speed)
37 {
38     ProjectileMovementComponent->SetVelocityInLocalSpace(Speed);
39     ProjectileMovementComponent->Activate();    //可以飞行了
40 }
41 //碰撞后发生的事件
42 void AProjectile::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
43 {
44     UE_LOG(LogTemp, Warning, TEXT("AProjectile::OnHit--OtherActor.Name=%s"),*OtherActor->GetName());    //撞击后给个提示
45
46     ProjectileMesh->SetNotifyRigidBodyCollision(false);    //碰撞之后再也不发生碰撞事件
47     //CollisionMesh->DestroyComponent();    //不是DestroyActor,Component是单一一个
48
49     //受伤害源OtherActor的TakeDamage()会被调用
50     UGameplayStatics::ApplyPointDamage(OtherActor, 10.0f, GetActorLocation(), Hit,NULL,NULL, UDamageType::StaticClass());
51
52     Destroy();
53 }

View Code

伤害的入口从OnHit看出,调用了UGameplayStatics::ApplyPointDamage;

第一个参数就是受伤害源,UE4的伤害系统会调用受伤害源的TakeDamege接口;

此时子弹有了伤害力,那么受伤害源就要被伤害;

每个actor都有这个接口virtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser);

只要重写这个接口,写上自己的处理逻辑。

受伤害源部分代码如下:

 1 float ADamagedActor::TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser)
 2 {
 3     float actuallyApplied = 0.0f;
 4
 5     MaxHP -= DamageAmount;
 6
 7     UE_LOG(LogTemp,Warning,TEXT("ADamagedActor::TakeDamage--MaxHP=%f"),MaxHP);
 8
 9     actuallyApplied = FMath::Clamp<float>(MaxHP, 0.0f, 100.0f);
10
11     return actuallyApplied;
12 }

View Code

以上就是简单的使用UE4的伤害系统。

转载于:https://www.cnblogs.com/yyfamily/p/9523795.html

UE4【C++】子弹伤害系统使用相关推荐

  1. UE4多武器弹药系统

    UE4多武器弹药系统 须知 项目情况分析 实现过程 代码结构 尾言 须知 该弹药系统按情况所需来选择,本次弹药系统是根据自身项目实际情况进行分析后得出适用于当前项目的,如有其它更优解法,欢迎讨论和提出 ...

  2. UE4仿真子弹 防止穿透及时间不匹配

    UE4仿真子弹 防止穿透及时间不匹配 常见游戏子弹设计思路 思路 实现 测试 常见游戏子弹设计思路 常见的游戏子弹设计思路有2个 一是网格体命中检测后给予模拟物理的component一个冲量后dest ...

  3. UE4 输入系统详解一、 UE4如何获取win系统输入消息

    UE4 输入系统详解一. UE4如何获取win系统输入消息 UE4版本:4.253 按键输入 1.当我们按下键盘时输入时,FEngineLoop::Tick()里的每个tick执行的PumpMessa ...

  4. java飞机大战大招和护盾_全民飞机大战:宠物六甲神将哪个技能会为战机添加护盾抵挡子弹伤害?...

    在全民飞机大战的游戏当中,微信每天都有着每日一题活动.小编这里要给大家带来的就是今天的每日一题宠物六甲神将哪个技能会为战机添加护盾抵挡子弹伤害的答案,有兴趣的就来看看吧. 全民飞机大战:宠物六甲神将哪 ...

  5. 《Exploring in UE4》Unreal回放系统剖析(上)

    回放,是电子游戏中一项常见的功能,用于记录整个比赛过程或者展示游戏中的精彩瞬间.通过回放,我们可以观摩高手之间的对决,享受游戏中的精彩瞬间,甚至还可以拿到敌方玩家的比赛录像进行分析和学习. 从实现技术 ...

  6. Unity枪击游戏之实现子弹伤害

    <Bullet>: public int damage = 60;///定义Bullet的伤害值为60 void Start()     {         Destroy(this.ga ...

  7. Building Worlds In Unreal 学习笔记——24-28 UE4.26的河流系统/自动河床材质/浮力/交互水面

    Building Worlds In Unreal 学习笔记--24-28 UE4.26的河流系统/自动河床材质/浮力/交互水面 Lec24 用UE4.26的水来做一条河 River Water wi ...

  8. 【UE4 第一人称射击游戏】23-添加子弹伤害

    上一篇: https://blog.csdn.net/ChaoChao66666/article/details/128589063?spm=1001.2014.3001.5501 本篇效果: 步骤: ...

  9. UE4学习笔记--EQS系统

    最近在研究虚幻4引擎的EQS系统,看了下官方对EQS的解释文档(官方文档链接:https://docs.unrealengine.com/en-US/Engine/ArtificialIntellig ...

  10. UE4学习之材质系统初探

    本文章所涉及素材均来源于网络,供学习使用,并不会实际投入到项目中 由于之前使用的印象笔记抽风,不能继续使用以供工作室学习交流,所以把平时学习时候的一些笔记搬运至博客,各位看官一笑就是: 这里主要是在介 ...

最新文章

  1. unity test相关
  2. 变更管理、信息系统安全管理、项目风险管理
  3. python办公自动化博客_自动化办公 Python 操控 Word
  4. java泛型中的E,K,V,T,U,S
  5. mysql skip slave_MYSQL replication slave-skip-errors 详解
  6. linux hosts和hostname
  7. 如果奇迹有颜色,那么一定是暴力or模拟比较6
  8. Java 定时器 Timer 与 定时任务 TimeTask
  9. Android 存储学习之在外部存储中读写文件
  10. 卷积神经网络+用pytorch构建神经网络
  11. android 锁屏显示消息格式,通知!在锁屏上显示Android通知 | MOS86
  12. 杀毒软件误删文件了怎么办?如何恢复被杀毒软件删除的文件
  13. fences卸载_Win10系统怎样卸载fences?Win10系统卸载fences图文教程-系统城
  14. NOIP中的数学--第6课 排列与组合
  15. php实时股票,PHP实现股票趋势图和柱形图
  16. java当中的定时器的4种使用方式(delay,period)
  17. 【渝粤题库】陕西师范大学203041 行政法与行政诉讼法学作业
  18. 扫福活动开始,你的公众号图文排版也要“福”气满满
  19. 搬家后计算机总重启,电脑老是开机后不久(几分钟)自动重启,重启一两遍后就可以正常运行...
  20. 《医院管理系统》项目研发总结

热门文章

  1. Visual Studio 2017 警告C4819解决方案
  2. php if变量满足数组,在php中使用if()查看数组中的日期是否等于变量中存储的日期...
  3. ❤️Docker教程小白实操入门 教程合集❤️
  4. Kubernetes 小白学习笔记(11)--搭建一个kubernetes集群-为worker节点配置命令行交互环境
  5. javascript 字符串与数组之间的相互转换(join、split)与splice介绍
  6. Android 四大组件 之 服务(Service)
  7. JavaScript JSON 对象使用详解、JSON. parse()、JSON. stringify()
  8. js原生继承几种方式
  9. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_7 获取Servlet原生的API
  10. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_10_Thread类的常用方法_设置线程名称...