目标:建立一个小药瓶,角色拾取后,生命值增加了!
步骤:
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
:参与重叠的另一方ActorOtherComp
:另一方的组件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.创建蓝图类
放入地图测试
碰撞前:
碰撞后:
完美!