Added : WaveManagement + Fix : RangeEnemy (un peu)

This commit is contained in:
sSebster 2025-03-10 15:03:39 +01:00
parent dc0abe0e0b
commit fbe2340f05
14 changed files with 165 additions and 15 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Content/Legumix/Spawner/BP_SpawnPosition.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Legumix/Spawner/BP_WaveManager.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Legumix/Spawner/LVL_TestSpawn.umap (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -2,6 +2,9 @@
#include "LMSpawnPosition.h"
#include "Kismet/GameplayStatics.h"
#include "Engine/World.h"
#include "DrawDebugHelpers.h"
// Sets default values
ALMSpawnPosition::ALMSpawnPosition()
@ -11,6 +14,11 @@ ALMSpawnPosition::ALMSpawnPosition()
}
bool ALMSpawnPosition::CanSpawn() const
{
return !IsPlayerVisible();
}
// Called when the game starts or when spawned
void ALMSpawnPosition::BeginPlay()
{
@ -22,6 +30,39 @@ void ALMSpawnPosition::BeginPlay()
void ALMSpawnPosition::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
UE_LOG(LogTemp, Warning, TEXT("CanSpawn: %s"), CanSpawn() ? TEXT("true") : TEXT("false"));
}
bool ALMSpawnPosition::IsPlayerVisible() const
{
AActor* Player = UGameplayStatics::GetPlayerPawn(GetWorld(), 0);
if (!Player) return false;
FVector Start = GetActorLocation();
FVector End = Player->GetActorLocation();
FHitResult HitResult;
FCollisionQueryParams Params;
Params.AddIgnoredActor(this);
bool bHit = GetWorld()->LineTraceSingleByChannel(
HitResult,
Start,
End,
ECC_Visibility,
Params
);
// Debug trace
DrawDebugLine(GetWorld(), Start, End, bHit ? FColor::Red : FColor::Green, false, 2.0f);
if (bHit)
{
UE_LOG(LogTemp, Warning, TEXT("LineTrace Hit: %s"), *HitResult.GetActor()->GetName());
return HitResult.GetActor() == Player; // Retourne true uniquement si l'acteur touché est le joueur
}
UE_LOG(LogTemp, Warning, TEXT("LineTrace: No Hit"));
return false; // Aucun obstacle, le joueur est visible
}

View File

@ -1,7 +1,7 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "LMWaveManager.h"
#include "Enemy/LMEnemy.h"
// Sets default values
ALMWaveManager::ALMWaveManager()
@ -15,13 +15,71 @@ ALMWaveManager::ALMWaveManager()
void ALMWaveManager::BeginPlay()
{
Super::BeginPlay();
StartWave();
}
void ALMWaveManager::SpawnEnemy(ALMSpawnPosition* spawnPosition, TSubclassOf<ALMEnemy> enemyToSpawn)
{
//Spawn sur une position
ALMEnemy* tempEnemy = GetWorld()->SpawnActor<ALMEnemy>(enemyToSpawn, spawnPosition->GetActorLocation(), FRotator::ZeroRotator);
//ajoute l'ennemis à la liste des ennemis vivants
EnemyAliveList.Add(tempEnemy);
//bind la method ennemydead à la death de l'ennemis
tempEnemy->OnEnemyDeath.AddUniqueDynamic(this, &ALMWaveManager::EnemyDead);
}
void ALMWaveManager::EnemyDead(ALMEnemy* enemyToRemoveFromLife)
{
//remove l'ennemis de la liste des ennemis vivants
enemyToRemoveFromLife->OnEnemyDeath.RemoveDynamic(this,&ALMWaveManager::EnemyDead);
EnemyAliveList.Remove(enemyToRemoveFromLife);
}
bool ALMWaveManager::RemainsEnemyToSpawn()
{
bool no = EnemyAliveList.Num() < MaxEnemyInstantiate;
return EnemyNumberInWave != EnemySpawned && no;
}
void ALMWaveManager::CheckForSpawnerOK()
{
SpawnPositionsOK.Empty();
for (ALMSpawnPosition* spawnPosition : SpawnPositionsList)
{
if(spawnPosition->CanSpawn())
{
SpawnPositionsOK.Add(spawnPosition);
}
}
}
// Called every frame
void ALMWaveManager::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if(RemainsEnemyToSpawn())
{
CheckForSpawnerOK();
if(SpawnPositionsOK.Num() > 0)
{
//Choose spawnpoint to spawn
int32 RandomIndex = FMath::RandRange(0, SpawnPositionsOK.Num() - 1);
SpawnEnemy(SpawnPositionsOK[RandomIndex],TypeOfEnemy);
EnemySpawned++;
}
}
else
{
//lauch break time
// Lance un timer de 3 secondes avant d'appeler StartWave()
GetWorld()->GetTimerManager().SetTimer(BreakTimer, this, &ALMWaveManager::StartWave, BreakTime, false);
}
}
void ALMWaveManager::StartWave()
{
}

View File

@ -18,11 +18,16 @@ class LEGUMEMIX_API ALMEnemy : public ACharacter
{
GENERATED_BODY()
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnEnnemyDeathSignature, ALMEnemy*, pleasefonctionne);
public:
ALMEnemy();
virtual void Tick(float DeltaTime) override;
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
UPROPERTY(BlueprintCallable, BlueprintAssignable, Category = "Legumix")
FOnEnnemyDeathSignature OnEnemyDeath;
protected:
virtual void BeginPlay() override;

View File

@ -15,6 +15,9 @@ public:
// Sets default values for this actor's properties
ALMSpawnPosition();
// Méthode pour vérifier si le spawn est possible
bool CanSpawn() const;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
@ -23,4 +26,6 @@ public:
// Called every frame
virtual void Tick(float DeltaTime) override;
private:
bool IsPlayerVisible() const;
};

View File

@ -4,8 +4,11 @@
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "LMSpawnPosition.h"
#include "LMWaveManager.generated.h"
class ALMEnemy;
UCLASS()
class LEGUMEMIX_API ALMWaveManager : public AActor
{
@ -14,13 +17,42 @@ class LEGUMEMIX_API ALMWaveManager : public AActor
public:
// Sets default values for this actor's properties
ALMWaveManager();
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"), Category = "Legumix")
TArray<ALMEnemy*> EnemyAliveList; // Liste des ennemis
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"), Category = "Legumix")
TArray<ALMSpawnPosition*> SpawnPositionsList; // Liste des ennemis
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"), Category = "Legumix")
int EnemyNumberInWave; // Nombre d'ennemis dans la wave
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"), Category = "Legumix")
int MaxEnemyInstantiate; // Nombre d'ennemis max spawnés
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"), Category = "Legumix")
TSubclassOf<ALMEnemy> TypeOfEnemy; // Type d'ennemis to spawn
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true"), Category = "Legumix")
float BreakTime; // Nombre d'ennemis dans la wave
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
virtual void StartWave();
virtual void SpawnEnemy(ALMSpawnPosition* spawnPosition, TSubclassOf<ALMEnemy> enemyToSpawn);
UFUNCTION()
virtual void EnemyDead(ALMEnemy* enemyToRemoveFromLife);
virtual bool RemainsEnemyToSpawn();
virtual void CheckForSpawnerOK();
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
private:
TArray<ALMSpawnPosition*> SpawnPositionsOK;
int EnemySpawned;
FTimerHandle BreakTimer;
};