六一的部落格


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




概览

C++


对游戏角色造成伤害

  • 虚幻引擎提供一组函数,用来对Actor造成伤害
  • 若有注册伤害处理服务, Actor受到伤害时触发处理函数
  • 本节在Tick函数中持续对游戏角色造成伤害

伤害处理服务

  • 我们在Actor提供的数据成员处注册伤害处理函数, 在处理函数中减少游戏角色生命值

持续对游戏角色造成伤害

C++

伤害来源是自己

ShootThemUp: Player/STUBaseCharacter.cpp

1// Tick
2TakeDamage(0.1f, FDamageEvent{}, GetController(), this);

伤害处理服务

  • AActor定义了委托类型FTakeAnyDamageSignature,并有该类型数据成员AActor::OnTakeAnyDamage
  • 我们通过数据成员注册伤害处理服务
  • 处理函数签名
    1void handler(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);
  • 该委托类型支持蓝图
  • 触发伤害处理函数时,会传入UDamageType

注册伤害机制的委托服务

C++


搭建框架

  1. 添加空函数

    ShootThemUp: Components/STUHealthComponent.cpp
    1void USTUHealthComponent::OnTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser) {}
  2. 注册伤害处理函数

    ShootThemUp: Components/STUHealthComponent.cpp
    1#include "GameFramework/Actor.h"
    2
    3// BeginPlay
    4AActor *TheOwner = GetOwner();
    5if (TheOwner)
    6{
    7    TheOwner->OnTakeAnyDamage.AddDynamic(this, &USTUHealthComponent::OnTakeAnyDamage);
    8}
  3. 添加函数声明

    private

    ShootThemUp: Components/STUHealthComponent.h
    1UFUNCTION()
    2void OnTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);

实现处理函数

ShootThemUp: Components/STUHealthComponent.cpp

1// OnTakeAnyDamage
2Health -= Damage;

差不多一秒10帧,即1s调用十次处理函数;Health减为0之后,继续减少


对游戏角色造成伤害



概览

C++


对游戏角色造成伤害

  • 虚幻引擎提供一组函数,用来对Actor造成伤害
  • 若有注册伤害处理服务, Actor受到伤害时触发处理函数
  • 本节在Tick函数中持续对游戏角色造成伤害

伤害处理服务

  • 我们在Actor提供的数据成员处注册伤害处理函数, 在处理函数中减少游戏角色生命值

持续对游戏角色造成伤害

C++

伤害来源是自己

ShootThemUp: Player/STUBaseCharacter.cpp

1// Tick
2TakeDamage(0.1f, FDamageEvent{}, GetController(), this);

伤害处理服务

  • AActor定义了委托类型FTakeAnyDamageSignature,并有该类型数据成员AActor::OnTakeAnyDamage
  • 我们通过数据成员注册伤害处理服务
  • 处理函数签名
    1void handler(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);
  • 该委托类型支持蓝图
  • 触发伤害处理函数时,会传入UDamageType

注册伤害机制的委托服务

C++


搭建框架

  1. 添加空函数

    ShootThemUp: Components/STUHealthComponent.cpp
    1void USTUHealthComponent::OnTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser) {}
  2. 注册伤害处理函数

    ShootThemUp: Components/STUHealthComponent.cpp
    1#include "GameFramework/Actor.h"
    2
    3// BeginPlay
    4AActor *TheOwner = GetOwner();
    5if (TheOwner)
    6{
    7    TheOwner->OnTakeAnyDamage.AddDynamic(this, &USTUHealthComponent::OnTakeAnyDamage);
    8}
  3. 添加函数声明

    private

    ShootThemUp: Components/STUHealthComponent.h
    1UFUNCTION()
    2void OnTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);

实现处理函数

ShootThemUp: Components/STUHealthComponent.cpp

1// OnTakeAnyDamage
2Health -= Damage;

差不多一秒10帧,即1s调用十次处理函数;Health减为0之后,继续减少