From 064d4cd57638d547d239fed4644ee97b9cf8be64 Mon Sep 17 00:00:00 2001 From: CatChow0 Date: Tue, 4 Nov 2025 18:29:30 +0100 Subject: [PATCH] Minor - Ajoute interaction projectile/champignon - V3.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implémente la détection de collision entre les projectiles et les champignons. Le champignon est détruit après avoir été touché le nombre de fois défini par sa durée de vie. Le projectile est détruit après avoir touché un champignon. --- Source/M4_CPP/private/M4_Mushroom.cpp | 19 +++--- Source/M4_CPP/private/M4_Projectile.cpp | 88 +++++++++++++------------ Source/M4_CPP/public/M4_Projectile.h | 8 ++- 3 files changed, 62 insertions(+), 53 deletions(-) diff --git a/Source/M4_CPP/private/M4_Mushroom.cpp b/Source/M4_CPP/private/M4_Mushroom.cpp index ba7fde7..3c2556c 100644 --- a/Source/M4_CPP/private/M4_Mushroom.cpp +++ b/Source/M4_CPP/private/M4_Mushroom.cpp @@ -6,6 +6,7 @@ #include "M4_CTP_Macros.h" #include "Kismet/GameplayStatics.h" #include "M4_Gamemode.h" +#include "M4_Projectile.h" // Sets default values @@ -38,19 +39,19 @@ AM4_Mushroom::AM4_Mushroom() void AM4_Mushroom::BeginPlay() { - MushLife = 3; + MushLife = 2; DestructionHit = 0; Super::BeginPlay(); } void AM4_Mushroom::OnHit(UPrimitiveComponent* HitComp,AActor* OtherActor,UPrimitiveComponent* OtherComp,FVector NormalImpulse,const FHitResult& Hit) { - if (OtherActor != this) - { - DestructionHit++; - if (DestructionHit == MushLife) - { - Destroy(); - } - } + // check if the other actor is a projectile + AM4_Projectile* Projectile = Cast(OtherActor); + if (!Projectile) + return; + + if (DestructionHit++ == MushLife) + Destroy(); + } \ No newline at end of file diff --git a/Source/M4_CPP/private/M4_Projectile.cpp b/Source/M4_CPP/private/M4_Projectile.cpp index 0252839..5b1ced5 100644 --- a/Source/M4_CPP/private/M4_Projectile.cpp +++ b/Source/M4_CPP/private/M4_Projectile.cpp @@ -2,51 +2,53 @@ #include "Components/MeshComponent.h" #include "M4_Gamemode.h" #include "M4_Mushroom.h" +#include "Components/SphereComponent.h" // Sets default values AM4_Projectile::AM4_Projectile() { - PrimaryActorTick.bCanEverTick = true; - - if(!RootComponent) - { - RootComponent = CreateDefaultSubobject(TEXT("ProjectileSceneComponent")); - ProjectileMeshComponent = CreateDefaultSubobject(TEXT("ProjectileMeshComponent")); - ProjectileMeshComponent->SetupAttachment(RootComponent); - - static ConstructorHelpers::FObjectFinder Mesh(TEXT("/Game/CTP/04_Mesh/SM_Projectile.SM_Projectile")); - if(Mesh.Succeeded()) - { - ProjectileMeshComponent->SetStaticMesh(Mesh.Object); - } + PrimaryActorTick.bCanEverTick = true; + + // Crée d'abord le composant de collision comme root + CollisionComp = CreateDefaultSubobject(TEXT("SphereComponent")); + CollisionComp->InitSphereRadius(15.0f); + CollisionComp->SetCollisionProfileName(TEXT("Projectile")); + CollisionComp->OnComponentBeginOverlap.AddDynamic(this, &AM4_Projectile::OnOverlap); + CollisionComp->SetGenerateOverlapEvents(true); + RootComponent = CollisionComp; + + // Ensuite attache le mesh au composant de collision + ProjectileMeshComponent = CreateDefaultSubobject(TEXT("ProjectileMeshComponent")); + ProjectileMeshComponent->SetupAttachment(RootComponent); + ProjectileMeshComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); // Le mesh ne gère pas la collision + + static ConstructorHelpers::FObjectFinder Mesh(TEXT("/Game/CTP/04_Mesh/SM_Projectile.SM_Projectile")); + if(Mesh.Succeeded()) + { + ProjectileMeshComponent->SetStaticMesh(Mesh.Object); + } - static ConstructorHelpers::FObjectFinder Material(TEXT("/Game/CTP/05_Material/M_Player.M_Player")); - if (Material.Succeeded()) - { - ProjectileMat = UMaterialInstanceDynamic::Create(Material.Object, ProjectileMeshComponent); - } + static ConstructorHelpers::FObjectFinder Material(TEXT("/Game/CTP/05_Material/M_Player.M_Player")); + if (Material.Succeeded()) + { + ProjectileMat = UMaterialInstanceDynamic::Create(Material.Object, ProjectileMeshComponent); + } - ProjectileMeshComponent->SetMaterial(0, ProjectileMat); - ProjectileMeshComponent->SetRelativeScale3D(FVector(.8f, .3f, .35f)); - ProjectileMeshComponent->SetMobility(EComponentMobility::Movable); - ProjectileMeshComponent->SetRelativeLocation(InitialLoc); + ProjectileMeshComponent->SetMaterial(0, ProjectileMat); + ProjectileMeshComponent->SetRelativeScale3D(FVector(.8f, .3f, .35f)); + ProjectileMeshComponent->SetMobility(EComponentMobility::Movable); + ProjectileMeshComponent->SetRelativeLocation(FVector::ZeroVector); - ProjectileMovementComponent = CreateDefaultSubobject(TEXT("ProjectileMovementComponent")); - ProjectileMovementComponent->SetUpdatedComponent(CollisionComp); - ProjectileMovementComponent->InitialSpeed = 380.f; - ProjectileMovementComponent->MaxSpeed = 380.f; - ProjectileMovementComponent->bRotationFollowsVelocity = false; - ProjectileMovementComponent->bShouldBounce = false; - ProjectileMovementComponent->ProjectileGravityScale = 0.0f; - - InitialLifeSpan = 10.f; - } - - if(!CollisionComp) - { - CollisionComp = CreateDefaultSubobject(TEXT("MeshComponent")); - } + // Configure le ProjectileMovementComponent + ProjectileMovementComponent = CreateDefaultSubobject(TEXT("ProjectileMovementComponent")); + ProjectileMovementComponent->SetUpdatedComponent(CollisionComp); // Maintenant CollisionComp existe + ProjectileMovementComponent->InitialSpeed = 380.f; + ProjectileMovementComponent->MaxSpeed = 380.f; + ProjectileMovementComponent->bRotationFollowsVelocity = false; + ProjectileMovementComponent->bShouldBounce = false; + ProjectileMovementComponent->ProjectileGravityScale = 0.0f; + InitialLifeSpan = 10.f; } ///FAIRE SUPER GAFFE AUX INDENTATIONS ET LES FOR LOOPS sont à bien faire. ///Ce qui est critique dans notre code doit être vraiment bien mis en évidence sans être obscurci par la boucle. @@ -58,17 +60,21 @@ void AM4_Projectile::BeginPlay() InitialLoc = GetActorLocation(); } -void AM4_Projectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) +void AM4_Projectile::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { + UE_LOG(LogTemp, Warning, TEXT("Projectile OVERLAP: %s"), *OtherActor->GetName()); + if (OtherActor && OtherActor != this && OtherComp != nullptr) { AM4_Mushroom* Mushroom = Cast(OtherActor); if (Mushroom) { - Mushroom->OnHit(HitComp,OtherActor,OtherComp,NormalImpulse,Hit); + UE_LOG(LogTemp, Warning, TEXT("OVERLAP MUSHROOM!")); + + FVector NormalImpulse = FVector::ZeroVector; + Mushroom->OnHit(OverlappedComponent, this, OtherComp, NormalImpulse, SweepResult); + Destroy(); } - - Destroy(); } } diff --git a/Source/M4_CPP/public/M4_Projectile.h b/Source/M4_CPP/public/M4_Projectile.h index 3d0059f..ba49c86 100644 --- a/Source/M4_CPP/public/M4_Projectile.h +++ b/Source/M4_CPP/public/M4_Projectile.h @@ -6,6 +6,7 @@ #include "GameFramework/Actor.h" #include "M4_Projectile.generated.h" +class USphereComponent; class UMeshComponent; UCLASS() @@ -25,7 +26,7 @@ public: FVector NewLoc; UPROPERTY(VisibleDefaultsOnly, Category = Projectile) - UMeshComponent* CollisionComp; + USphereComponent* CollisionComp; UPROPERTY(VisibleAnywhere, Category = Movement) UProjectileMovementComponent* ProjectileMovementComponent; @@ -36,7 +37,8 @@ public: UPROPERTY(VisibleDefaultsOnly, Category = Projectile) UMaterialInstanceDynamic* ProjectileMat; - UFUNCTION() - void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit); + UFUNCTION() + void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); void FireInDir(const FVector& ShootDir); }; +