I have made some C++ class based on Actor:
Then I made Blueprint from that class:
And add some events about cursor to MouseCollision box.
All works fine, event fire when mouse over MouseCollision box.
But when i copy blueprint from another placed blueprint things go wrong!
Copy #2 fire up events in it self and Copy #1, Copy #3 fire up events in it self and in #2 and #1, while only Copy #1 fire event only in it self.
All on this [video][2].
What am I doing wrong?)
C++ 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();
UPROPERTY(EditAnywhere)
UBoxComponent* ComBox;
UPROPERTY(EditAnywhere)
UBoxComponent* MouseCollision;
UPROPERTY(EditAnywhere)
UStaticMeshComponent* BaseMesh;
UFUNCTION(BlueprintCallable, Category = "cFunctions")
void OnBeginMouseCollisionCursorOver(UPrimitiveComponent * TouchedComponent);
// 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));
MouseCollision->OnBeginCursorOver.AddDynamic(this, &Aclass_BaseGameBlock::OnBeginMouseCollisionCursorOver);
BaseMesh->AttachTo(RootComponent);
}
// Called when the game starts or when spawned
void Aclass_BaseGameBlock::BeginPlay()
{
Super::BeginPlay();
}
// 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)));
}
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::OnBeginMouseCollisionCursorOver(UPrimitiveComponent * TouchedComponent)
{
}