1.写在构造函数里Actor.cpp
AMyActor::AMyActor(){
PrimaryActorTick.bCanEverTick = true;
//碰撞预设(碰撞已启用)
MyBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);//无碰撞
MyBox->SetCollisionEnabled(ECollisionEnabled::QueryOnly);//纯查询(无物理碰撞)
MyBox->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly);//纯物理(不查询碰撞)
MyBox->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);//已启用碰撞(查询和物理)
MyBox->SetCollisionEnabled(ECollisionEnabled::ProbeOnly);//仅探测(接触数据,无查询或物理碰撞)
MyBox->SetCollisionEnabled(ECollisionEnabled::QueryAndProbe);//查询和探测(查询碰撞和接触数据,无物理碰撞)
//碰撞预设(对象类型)
MyBox->SetCollisionObjectType(ECC_WorldStatic);//世界静态
MyBox->SetCollisionObjectType(ECC_WorldDynamic);//世界动态
MyBox->SetCollisionObjectType(ECC_Pawn);//Pawn
MyBox->SetCollisionObjectType(ECC_PhysicsBody);//物理体
MyBox->SetCollisionObjectType(ECC_Vehicle);//车辆
MyBox->SetCollisionObjectType(ECC_Destructible);//破裂体
//碰撞预设(碰撞响应)
MyBox->SetCollisionResponseToAllChannels(ECR_Block);//对所有通道设置响应为阻挡
MyBox->SetCollisionResponseToAllChannels(ECR_Overlap);//对所有通道设置响应为重叠
MyBox->SetCollisionResponseToAllChannels(ECR_Ignore);//对所有通道设置响应为忽略
MyBox->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap);//对单个通道设置响应为重叠
MyBox->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block);//对单个通道设置响应为阻挡
MyBox->SetCollisionResponseToChannel(ECC_WorldDynamic, ECR_Ignore);//对单个通道设置响应为忽略
}
2.1构造函数里设置
AMyActor::AMyActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
//设置盒体范围
MyBox->SetBoxExtent(FVector(64, 64, 64));
}
2.2在开始里写默认失效
void AMyActor::BeginPlay()
{
Super::BeginPlay();
//默认失效
if (MyParticle) {
MyParticle->Deactivate();
}
//盒体碰撞组件->BeginOverlap事件代理绑定
MyBox->OnComponentBeginOverlap.AddDynamic(this, &AMyActor::BeginOverlapFunction);
MyBox->OnComponentEndOverlap.AddDynamic(this, &AMyActor::EndOverlapFunction);
//盒体碰撞组件->Hit事件代理绑定
MyBox->OnComponentHit.AddDynamic(this, &AMyActor::HitFunction);
}
2.3写上激活和失效函数
void AMyActor::BeginOverlapFunction(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult){
MyParticle->Activate();//特效激活
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("BeginOverLapEvent is success"));
}
void AMyActor::EndOverlapFunction(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex){
MyParticle->Deactivate();//特效失效
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("EndOverLapEvent is success"));
}