I’ve made C++ class based on Actor.
Then extend it with Blueprint where add OnClicked event and connect it to PrintString.
Then place that Blueprint in a level and copy it several times.
When I click on first placed Blueprint all OK one PrintString occur.
But when I click on Copy #1 it fire up OnClicked event in it self and in first placed Blueprint.
When click on Copy #2 OnClicked event fire ups in it self in Copy #1 and in first placed Blueprint and so on!
This bug is permanent and saved with level, because glitch occur in Blueprint body.
Errors begins from line #8 at “Begin Object Class=BoxComponent Name=“MouseCollision””
It declares four bodies!
OnClicked delegate glitch in line #56
Constructor delegate OnClicked event to it “parents”
OnClicked=(BP_BaseBlock_v1_111.BndEvt__MouseCollision_K2Node_ComponentBoundEvent_46_ComponentOnClickedSignature__DelegateSignature,BP_BaseBlock_v1_6.BndEvt__MouseCollision_K2Node_ComponentBoundEvent_46_ComponentOnClickedSignature__DelegateSignature,BP_BaseBlock_v1_7.BndEvt__MouseCollision_K2Node_ComponentBoundEvent_46_ComponentOnClickedSignature__DelegateSignature,BP_BaseBlock_v1_8.BndEvt__MouseCollision_K2Node_ComponentBoundEvent_46_ComponentOnClickedSignature__DelegateSignature)
Here is files:
class.h
#pragma once
#include "GameFramework/Actor.h"
#include "class_BaseGameBlock.generated.h"
UCLASS()
class MINESWEEPERII_API Aclass_BaseGameBlock : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
Aclass_BaseGameBlock();
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick( float DeltaSeconds ) override;
virtual void PostInitProperties() override;
virtual void PostEditChangeProperty(FPropertyChangedEvent& PCE) override;
virtual void GetBaseMeshSize();
// Mouse Events.
// Override Event Begin Mouse Over on MouseCollisionBox
UFUNCTION(BlueprintNativeEvent, Category = "Custom. | Mouse Events.")
void OnBeginMouseCollisionBoxCursorOver(UPrimitiveComponent * TouchedComponent);
// Override Event End Mouse Over on MouseCollisionBox
UFUNCTION(BlueprintNativeEvent, Category = "Custom. | Mouse Events.")
void OnEndMouseCollisionBoxCursorOver(UPrimitiveComponent * TouchedComponent);
private:
UPROPERTY(EditAnywhere)
UBoxComponent* ComBox;
UPROPERTY(EditAnywhere)
UBoxComponent* MouseCollision;
UPROPERTY(EditAnywhere)
UStaticMeshComponent* BaseMesh;
// Debug
UPROPERTY(EditAnywhere, Category = "Mesh Size")
FVector MeshSizeMin;
UPROPERTY(EditAnywhere, Category = "Mesh Size")
FVector MeshSizeMax;
UPROPERTY(EditAnywhere, Category = "Mesh Size")
float MeshSizeX;
UPROPERTY(EditAnywhere, Category = "Mesh Size")
float MeshSizeY;
UPROPERTY(EditAnywhere, Category = "Mesh Size")
float MeshSizeZ;
};
class.cpp
#include "MinesWeeperII.h"
#include "class_BaseGameBlock.h"
Aclass_BaseGameBlock::Aclass_BaseGameBlock()
{
// 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;
ComBox = CreateDefaultSubobject<UBoxComponent>(TEXT("ComBox"));
MouseCollision = CreateDefaultSubobject<UBoxComponent>(TEXT("MouseCollision"));
BaseMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BaseMesh"));
RootComponent = ComBox;
MouseCollision->SetBoxExtent(FVector(10.f, 10.f, 2.f));
MouseCollision->AttachTo(RootComponent);
MouseCollision->SetRelativeLocation(FVector(0.f, 0.f, 20.f));
BaseMesh->AttachTo(RootComponent);
// GetBaseMeshSize();
}
// Called when the game starts or when spawned
void Aclass_BaseGameBlock::BeginPlay()
{
Super::BeginPlay();
MouseCollision->OnBeginCursorOver.AddDynamic(this, &Aclass_BaseGameBlock::OnBeginMouseCollisionBoxCursorOver);
MouseCollision->OnEndCursorOver.AddDynamic(this, &Aclass_BaseGameBlock::OnEndMouseCollisionBoxCursorOver);
}
// Called every frame
void Aclass_BaseGameBlock::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
}
void Aclass_BaseGameBlock::PostInitProperties()
{
Super::PostInitProperties();
//GetBaseMeshSize();
}
void Aclass_BaseGameBlock::PostEditChangeProperty(FPropertyChangedEvent & PCE)
{
GetBaseMeshSize();
Super::PostEditChangeProperty(PCE);
}
void Aclass_BaseGameBlock::GetBaseMeshSize()
{
if (BaseMesh->StaticMesh != nullptr)
{
BaseMesh->GetLocalBounds(MeshSizeMin, MeshSizeMax);
MeshSizeX = MeshSizeMax.X - MeshSizeMin.X;
MeshSizeY = MeshSizeMax.Y - MeshSizeMin.Y;
MeshSizeZ = MeshSizeMax.Z - MeshSizeMin.Z;
MouseCollision->SetBoxExtent(FVector(MeshSizeX / 2.f, MeshSizeY / 2.f, 1.f));
MouseCollision->SetRelativeLocation(FVector(0.f, 0.f, MeshSizeZ - 1.f));
ComBox->SetBoxExtent(FVector(MeshSizeX * .55f, MeshSizeY * .55f, FMath::FRandRange(1.f, 4.f)));
// ComBox Является корнем, его нельзя двигать.
// ComBox->SetRelativeLocation(FVector(0.f, 0.f, -2.f));
}
else
{
MeshSizeMax = FVector(0.f);
MeshSizeMin = FVector(0.f);
MeshSizeX = 0.f;
MeshSizeY = 0.f;
MeshSizeZ = 0.f;
MouseCollision->SetBoxExtent(FVector(4.f));
ComBox->SetBoxExtent(FVector(4.f));
}
}
void Aclass_BaseGameBlock::OnBeginMouseCollisionBoxCursorOver_Implementation(UPrimitiveComponent * TouchedComponent)
{
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::Cyan, TEXT("BEGIN Mouse Over"));
}
}
void Aclass_BaseGameBlock::OnEndMouseCollisionBoxCursorOver_Implementation(UPrimitiveComponent * TouchedComponent)
{
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 2.f, FColor::Cyan, TEXT("END Mouse Over"));
}
}
And Blueprint bodies.
First placed Blueprint:
Begin Map
Begin Level
Begin Actor Class=BP_BaseBlock_v1_0_C Name=BP_BaseBlock_v1_111 Archetype=BP_BaseBlock_v1_0_C'/Game/BluePrints/BP_BaseBlock_v1_0.Default__BP_BaseBlock_v1_0_C'
Begin Object Class=TextRenderComponent Name="txtName" Archetype=TextRenderComponent'BP_BaseBlock_v1_0_C:txtName_GEN_VARIABLE'
End Object
Begin Object Class=StaticMeshComponent Name="BaseMesh" Archetype=StaticMeshComponent'Default__BP_BaseBlock_v1_0_C:BaseMesh'
End Object
Begin Object Class=BoxComponent Name="MouseCollision" Archetype=BoxComponent'Default__BP_BaseBlock_v1_0_C:MouseCollision'
Begin Object Class=BodySetup Name="BodySetup_27"
End Object
End Object
Begin Object Class=BoxComponent Name="ComBox" Archetype=BoxComponent'Default__BP_BaseBlock_v1_0_C:ComBox'
Begin Object Class=BodySetup Name="BodySetup_26"
End Object
End Object
Begin Object Name="txtName"
AttachParent=ComBox
bNetAddressable=True
CreationMethod=SimpleConstructionScript
End Object
Begin Object Name="BaseMesh"
AttachParent=ComBox
End Object
Begin Object Name="MouseCollision"
Begin Object Name="BodySetup_27"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=102984512.000000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=102986752.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=66.000000,Y=-170.000000,Z=0.743229)),X=40.000000,Y=40.000000,Z=2.000000)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
BodyInstance=(MassInKg=2.392558)
OnBeginCursorOver=()
OnEndCursorOver=()
OnClicked=(BP_BaseBlock_v1_111.BndEvt__MouseCollision_K2Node_ComponentBoundEvent_46_ComponentOnClickedSignature__DelegateSignature)
AttachParent=ComBox
End Object
Begin Object Name="ComBox"
Begin Object Name="BodySetup_26"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=103013184.000000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=103015424.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=66.000000,Y=-170.000000,Z=-10.000000)),X=44.000000,Y=44.000000,Z=2.624775)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
BoxExtent=(X=22.000000,Y=22.000000,Z=1.312387)
RelativeLocation=(X=66.000000,Y=-170.000000,Z=-10.000000)
End Object
txtName=txtName
ComBox=ComBox
MouseCollision=MouseCollision
BaseMesh=BaseMesh
RootComponent=ComBox
ActorLabel="BP_BaseBlock_v1_5"
End Actor
End Level
Begin Surface
End Surface
End Map
Copy #5 of first placed Blueprint
Begin Map
Begin Level
Begin Actor Class=BP_BaseBlock_v1_0_C Name=BP_BaseBlock_v1_8 Archetype=BP_BaseBlock_v1_0_C'/Game/BluePrints/BP_BaseBlock_v1_0.Default__BP_BaseBlock_v1_0_C'
Begin Object Class=TextRenderComponent Name="txtName" Archetype=TextRenderComponent'BP_BaseBlock_v1_0_C:txtName_GEN_VARIABLE'
End Object
Begin Object Class=StaticMeshComponent Name="BaseMesh" Archetype=StaticMeshComponent'Default__BP_BaseBlock_v1_0_C:BaseMesh'
End Object
Begin Object Class=BoxComponent Name="MouseCollision" Archetype=BoxComponent'Default__BP_BaseBlock_v1_0_C:MouseCollision'
Begin Object Class=BodySetup Name="BodySetup_31"
End Object
Begin Object Class=BodySetup Name="BodySetup_27"
End Object
Begin Object Class=BodySetup Name="BodySetup_29"
End Object
Begin Object Class=BodySetup Name="BodySetup_43"
End Object
End Object
Begin Object Class=BoxComponent Name="ComBox" Archetype=BoxComponent'Default__BP_BaseBlock_v1_0_C:ComBox'
Begin Object Class=BodySetup Name="BodySetup_30"
End Object
Begin Object Class=BodySetup Name="BodySetup_26"
End Object
Begin Object Class=BodySetup Name="BodySetup_28"
End Object
Begin Object Class=BodySetup Name="BodySetup_42"
End Object
End Object
Begin Object Name="txtName"
AttachParent=ComBox
bNetAddressable=True
CreationMethod=SimpleConstructionScript
End Object
Begin Object Name="BaseMesh"
AttachParent=ComBox
End Object
Begin Object Name="MouseCollision"
Begin Object Name="BodySetup_31"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=1027238.500000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=1027256.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=0.000000,Y=0.000000,Z=10.743229)),X=40.000000,Y=40.000000,Z=2.000000)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
Begin Object Name="BodySetup_27"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=102984512.000000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=102986752.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=66.000000,Y=-170.000000,Z=0.743229)),X=40.000000,Y=40.000000,Z=2.000000)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
Begin Object Name="BodySetup_29"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=0.000000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=0.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=0.000000,Y=0.000000,Z=10.743229)),X=40.000000,Y=40.000000,Z=2.000000)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
Begin Object Name="BodySetup_43"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=56398725513216.000000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=56399899918336.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=0.000000,Y=0.000000,Z=10.743229)),X=40.000000,Y=40.000000,Z=2.000000)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
BodyInstance=(MassInKg=2.392558)
OnBeginCursorOver=()
OnEndCursorOver=()
OnClicked=(BP_BaseBlock_v1_111.BndEvt__MouseCollision_K2Node_ComponentBoundEvent_46_ComponentOnClickedSignature__DelegateSignature,BP_BaseBlock_v1_6.BndEvt__MouseCollision_K2Node_ComponentBoundEvent_46_ComponentOnClickedSignature__DelegateSignature,BP_BaseBlock_v1_7.BndEvt__MouseCollision_K2Node_ComponentBoundEvent_46_ComponentOnClickedSignature__DelegateSignature,BP_BaseBlock_v1_8.BndEvt__MouseCollision_K2Node_ComponentBoundEvent_46_ComponentOnClickedSignature__DelegateSignature)
AttachParent=ComBox
End Object
Begin Object Name="ComBox"
Begin Object Name="BodySetup_30"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=1027126.500000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=1027144.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=0.000000,Y=0.000000,Z=0.000000)),X=44.000000,Y=44.000000,Z=7.688894)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
Begin Object Name="BodySetup_26"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=103013184.000000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=103015424.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=66.000000,Y=-170.000000,Z=-10.000000)),X=44.000000,Y=44.000000,Z=2.624775)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
Begin Object Name="BodySetup_28"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=0.000000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=0.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=0.000000,Y=0.000000,Z=0.000000)),X=44.000000,Y=44.000000,Z=6.236458)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
Begin Object Name="BodySetup_42"
AggGeom=(BoxElems=((TM=(XPlane=(W=0.000000,X=1.000000,Y=0.000000,Z=0.000000),YPlane=(W=0.000000,X=56406241705984.000000,Y=0.000000,Z=-882418623149244416.000000),ZPlane=(W=0.000000,X=56407416111104.000000,Y=0.000000,Z=0.000000),WPlane=(W=1.000000,X=0.000000,Y=0.000000,Z=0.000000)),X=44.000000,Y=44.000000,Z=3.294778)))
CollisionTraceFlag=CTF_UseSimpleAsComplex
End Object
BoxExtent=(X=22.000000,Y=22.000000,Z=1.647389)
RelativeLocation=(X=184.000000,Y=-235.000000,Z=-10.000000)
End Object
txtName=txtName
ComBox=ComBox
MouseCollision=MouseCollision
BaseMesh=BaseMesh
RootComponent=ComBox
ActorLabel="BP_BaseBlock_v1_8"
End Actor
End Level
Begin Surface
End Surface
End Map
Here is a link to my first question where this glitch occur with “OnBeginCursorOver” event.
This question extended with more details and blueprint bodies code.