C++ 使用OnComponentHit UE4 C和#x2B进行碰撞检测+;

C++ 使用OnComponentHit UE4 C和#x2B进行碰撞检测+;,c++,unreal-engine4,C++,Unreal Engine4,我有碰撞的问题。我想做一个简单的射弹。我已经做了一个演员,其中有根,球体和网格组件。当这个演员击中目标对象时,什么也不会发生。 我已经尝试了很多方法,也用了很多方法 void OnOverlapBegin(类UPrimitiveComponent*OverlappedComp,类AActor*OtherActor,类UPrimitiveComponent*OtherComp,int32 OtherBodyIndex,bool bFromSweep,const fhirtResult&SweepR

我有碰撞的问题。我想做一个简单的射弹。我已经做了一个演员,其中有根,球体和网格组件。当这个演员击中目标对象时,什么也不会发生。 我已经尝试了很多方法,也用了很多方法

void OnOverlapBegin(类UPrimitiveComponent*OverlappedComp,类AActor*OtherActor,类UPrimitiveComponent*OtherComp,int32 OtherBodyIndex,bool bFromSweep,const fhirtResult&SweepResult);
超过范围无效(类UPrimitiveComponent*OverlappedComp、类AActor*OtherActor、类UPrimitiveComponent*OtherComp、int32 OtherBodyIndex);
函数,但没有任何结果

这是我的定制射弹的构造器:

AProjectile_2::AProjectile_2()
{
//将此参与者设置为每帧调用Tick()。如果不需要,可以关闭此选项以提高性能。
PrimaryActorTick.bCanEverTick=true;
Root=CreateDefaultSubobject(文本(“根”));
RootComponent=根;
网格=CreateDefaultSubobject(文本(“staticMesh”);
静态构造函数助手::FObjectFinderSphereMeshAsset(文本(“/Game/StarterContent/Shapes/Shape\u Sphere.Shape\u Sphere”);
if(SphereMeshAsset.successed())
{
网格->设置静态网格(SphereMeshAsset.Object);
网格->SetWorldScale3D(FVector(0.2f));
}
网格->可设置重力(真);
网格->设置模拟物理(真实);
网格->设置附着(根);
Sphere=CreateDefaultSubobject(文本(“SphereComponent”);
球体->初始球体半径(5.f);
球体->设置附件(根);
Sphere->SetCollisionProfileName(文本(“目标”);
Sphere->OnComponentHit.AddDynamic(this,&AProjectile_2::OnHit);
球体->设置附件(根组件);
初始寿命=5.f;
}
这里有一个检测函数

void aprojective_2::OnHit(UPrimitiveComponent*HitComp,AActor*OtherActor,UPrimitiveComponent*OtherComp,FVector NormalImpulse,const fhirtresult&Hit)
{
if((OtherActor!=NULL)&&&(OtherActor!=this)&&&(OtherComp!=NULL))
{
if(OtherActor&&(OtherActor!=this)&&OtherComp&&OtherActor->GetClass()->IsChildOf(ADestroypack::StaticClass())
{
destroypack=(ADestroypack*)其他参与者;
销毁包装->降低生命值(50);
destroypack->检查_hp();
destroypack->showhp();
}
}
}
在这里,我的网格得到了移动的力量

void a项目2::Initvel(FVector速度)
{
网格->附加力(速度*300);
}
这是我用RMB按钮拍摄的角色功能

void AHero::Attack_right()
{
FVector Location=GetWorld()->GetFirstPlayerController()->GetPawn()->GetActorLocation();
FRotator Rotation=GetWorld()->GetFirstPlayerController()->GetPawn()->GetActorRotation();
GetActorEyesViewPoint(位置、旋转);
射弹=(一个射弹_2*)GetWorld()->SpawnActor(一个射弹_2::StaticClass()、位置和旋转);
FVector LaunchDir;
LaunchDir=GetActorForwardVector()*5000.f;
射弹->初始层(发射层);
}
如果有人能说我做错了什么,或者说我的项目缺少了什么,我会非常感激

好的!我已经弄明白了!:D 我在网格和球体中添加重力和物理时犯了一个错误。我已将其从网格中删除,现在可以使用:)

AProjectile_2::AProjectile_2()
{
//将此参与者设置为每帧调用Tick()。如果不需要,可以关闭此选项以提高性能。
PrimaryActorTick.bCanEverTick=true;
//Root=CreateDefaultSubobject(文本(“根”));
//RootComponent=根;
Sphere=CreateDefaultSubobject(文本(“SphereComponent”);
球体->设置模拟物理(真);
球体->可设置重力(真);
Sphere->SetNotifyRigIDodyCollision(真);
球体->初始球体半径(40.f);
Sphere->BodyInstance.SetCollisionProfileName(“BlockAllDynamic”);
Sphere->SetCollisionProfileName(文本(“目标”);
Sphere->OnComponentHit.AddDynamic(this,&AProjectile_2::OnHit);
根组件=球体;
网格=CreateDefaultSubobject(文本(“staticMesh”);
静态构造函数助手::FObjectFinderSphereMeshAsset(文本(“/Game/StarterContent/Shapes/Shape\u Sphere.Shape\u Sphere”);
if(SphereMeshAsset.successed())
{
网格->设置静态网格(SphereMeshAsset.Object);
网格->添加相对位置(FVector(0.f,0.f,0.f));
网格->SetWorldScale3D(FVector(0.2f));
}
/*网格->可设置重力(真);
网格->设置模拟物理(真实);
mesh->SetGenerateOverlapEvents(真)*/
网格->设置附件(根组件);
初始寿命=5.f;
}

如果您使用的是OnOverlapBegin,您的组件应该使用重叠来对其他组件进行碰撞响应,而不是阻塞。

您应该在
BeginPlay
函数中添加动态委托。与Sphere组件的设置相关的其余代码可以保留在构造函数中。原因是,在“虚幻”中,如果您首先制作了蓝图,将其作为投射物cpp类的父级,但随后添加了构造函数中声明的
OnComponentHit
功能,那么它将无法工作。仅当蓝图从一开始就使用cpp类(包括
OnComponentHit
委托)创建时,它才会在构造函数中工作。这是一个经常被忽视的非常普遍的问题

如果尚未将
BeginPlay
函数添加到头文件,请确保将其添加到头文件中

virtual void BeginPlay() override;
然后在cpp文件中,声明函数并将对
AddDynamic
的调用从构造函数移动到
BeginPlay

void AProjectile_2::BeginPlay()
{
    Super::BeginPlay();
    Sphere->OnComponentHit.AddDynamic(this, &AProjectile_2::OnHit);
}