虚幻引擎5 GAS开发俯视角RPG游戏 P02-12 Effect Actor

目标:建立一个小药瓶,角色拾取后,生命值增加了!

步骤:

1.创建一个药品Actor

(1)创建Actor类:

(2)整理类,将不需要的方法去掉

CCEffectActor.h

// 版权归陈超所有

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CCEffectActor.generated.h"

UCLASS()
class CC_AURA_API ACCEffectActor : public AActor
{
	GENERATED_BODY()
	
public:	
	ACCEffectActor();

protected:
	virtual void BeginPlay() override;

};

CCEffectActor.cpp:

// 版权归陈超所有


#include "Actor/CCEffectActor.h"

ACCEffectActor::ACCEffectActor()
{
 	// 将此参与者设置为每帧调用Tick()。如果你不需要它,你可以关闭它来提高性能。
	PrimaryActorTick.bCanEverTick = false;

}

// 在游戏开始或生成时调用
void ACCEffectActor::BeginPlay()
{
	Super::BeginPlay();
	
}

(3)创建物品的静态网格体和一个碰撞球体:

	UPROPERTY(VisibleAnywhere)
	UStaticMeshComponent* Mesh;		//物品的静态网格体

	UPROPERTY(VisibleAnywhere)
	USphereComponent* Sphere;		//碰撞球体

(4)在类的构造函数初始化变量


ACCEffectActor::ACCEffectActor()
{
 	// 将此参与者设置为每帧调用Tick()。如果你不需要它,你可以关闭它来提高性能。
	PrimaryActorTick.bCanEverTick = false;

	//物品的静态网格体
	Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
	SetRootComponent(Mesh);

	//碰撞球体
	Sphere = CreateDefaultSubobject<USphereComponent>(TEXT("Sphere"));
	Sphere->SetupAttachment(GetRootComponent());
	
}

2.创建一个碰撞事件,绑定回调函数:OnComponentBeginOverlap

(1).在PrimitiveComponent.h中,看到OnComponentBeginOverlap的定义:

DECLARE_DYNAMIC_MULTICAST_SPARSE_DELEGATE_SixParams( FComponentBeginOverlapSignature, UPrimitiveComponent, OnComponentBeginOverlap, UPrimitiveComponent*, OverlappedComponent, AActor*, OtherActor, UPrimitiveComponent*, OtherComp, int32, OtherBodyIndex, bool, bFromSweep, const FHitResult &, SweepResult);

这是UE引擎中用于声明碰撞开始重叠事件的动态多播稀疏委托宏,主要特性如下:

核心参数解析‌:

  • FComponentBeginOverlapSignature:生成的委托类型名称
  • UPrimitiveComponent:委托所属的类类型
  • OnComponentBeginOverlap:实际委托成员变量名
  • 后续6个参数定义回调函数参数列表:
    • OverlappedComponent:触发重叠的组件
    • OtherActor:参与重叠的另一方Actor
    • OtherComp:另一方的组件
    • OtherBodyIndex:物理体索引
    • bFromSweep:是否来自扫描测试
    • SweepResult:包含碰撞检测详细数据

技术特性‌:

  • 动态(Dynamic):支持蓝图绑定
  • 多播(Multicast):允许多个函数同时订阅
  • 稀疏(Sparse):内存优化设计,适合低频使用场景
  • 六参数(SixParams):明确参数数量限制

典型使用场景‌:

// 组件类声明中
UPROPERTY(BlueprintAssignable)
FComponentBeginOverlapSignature OnComponentBeginOverlap;

// 绑定示例(通常在构造函数中)
CollisionComp->OnComponentBeginOverlap.AddDynamic(this, &AClass::HandleOverlap);

注意事项‌:

  • 需配合UPrimitiveComponent派生类使用
  • 回调函数参数必须严格匹配宏定义顺序
  • 稀疏委托适合内存敏感场景,高频事件建议用普通委托
  • 蓝图绑定需使用UFUNCTION标记回调函数

所以,他的回调函数可以这样定义:

//碰撞回调函数
	UFUNCTION()
	virtual void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult &  SweepResult);

(2).在BeginPlay()函数里,调用物体碰撞事件,绑定了回调函数

// 在游戏开始或生成时调用
void ACCEffectActor::BeginPlay()
{
	Super::BeginPlay();

	//球体碰撞事件
	Sphere->OnComponentBeginOverlap.AddDynamic(this, &ACCEffectActor::OnOverlap);
	
}

这段代码是UE5中效果Actor的初始化逻辑,主要功能如下:

生命周期管理‌:

  • 通过Super::BeginPlay()确保父类初始化逻辑执行
  • 在游戏对象生成时自动调用

碰撞事件绑定‌:

  • 为球体组件(Sphere)绑定重叠开始事件
  • 使用AddDynamic宏实现蓝图可绑定的动态委托
  • 事件触发时将调用OnOverlap成员函数

典型应用场景‌:

  • 常用于技能范围检测、道具拾取等游戏机制
  • 需确保Sphere组件已通过CreateDefaultSubobject创建
  • 配合前文的OnOverlap实现完整交互逻辑

注意事项‌:

  • 建议添加空指针检查:if(Sphere) {...}
  • 网络游戏需考虑ROLE_Authority权限控制
  • 组件销毁时应使用RemoveDynamic解除绑定

(3)实现回调函数


void ACCEffectActor::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
	UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	// TODO: 为了测试数值修改功能,启用了常量转变量功能。
	if (const IAbilitySystemInterface* AbilitySystemInterface = Cast<IAbilitySystemInterface>(OtherActor))	
	{
		//获取ASC
		const UCCAbilitySystemComponent* AbilitySystemComponent = Cast<UCCAbilitySystemComponent>(AbilitySystemInterface->GetAbilitySystemComponent());
		//根据类从ASC里面获取到对应的AS实例
		const UCCAttributeSet* AttributeSet = Cast<UCCAttributeSet>(AbilitySystemComponent->GetAttributeSet(UCCAttributeSet::StaticClass()));
		//将常量转为变量
		UCCAttributeSet* MutableAttributeSet =const_cast<UCCAttributeSet*>(AttributeSet);
		//设置生命值
		MutableAttributeSet->SetHealth(AttributeSet->GetHealth() + 25.f);
		// 销毁自身
		Destroy(); 
	}
}

这段代码实现了UE5 GAS系统中效果Actor的碰撞处理逻辑,主要功能如下:

碰撞检测处理‌:

  • 通过OnOverlap回调响应组件重叠事件
  • 参数包含重叠组件、对方Actor、碰撞检测结果等完整信息

能力系统交互‌:

  • 通过IAbilitySystemInterface接口获取对方Actor的ASC组件
  • 使用GetAttributeSet获取属性集实例
  • 采用const_cast解除常量限制进行属性修改(需注意线程安全问题)

属性修改逻辑‌:

  • 直接操作UCCAttributeSet的Health属性实现数值增减
  • 修改后自动销毁效果Actor(Destroy()调用)

注意事项‌:

  • 常量转变量操作存在风险,正式环境建议使用AttributeSet提供的正规修改方法
  • 销毁Actor会触发网络同步和垃圾回收流程
  • 建议添加空指针检查和网络角色验证

该实现是典型的瞬时效果处理模式,适用于血包、buff等游戏机制11。如需持久效果应改用GameplayEffect系统。

3.创建蓝图类

放入地图测试

碰撞前:

碰撞后:

完美!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值