RPG61.制作敌人攻击波数一
1。创建一个gamemode的c++类
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameMode/XMBGameModeBase.h"
#include "XMBSurvialGameMode.generated.h"UENUM(BlueprintType)
enum class EXMBSurvialGameModeState : uint8
{WaitSpawnNewWava,SpawningNewWava,InProgress,WaveComleted,AllWavesDonw,PlayerDied
};//
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSurvialGameModeStateChanged, EXMBSurvialGameModeState, CurrentState);/*** */
UCLASS()
class ARPG_GRIVITY_API AXMBSurvialGameMode : public AXMBGameModeBase
{GENERATED_BODY()protected:virtual void BeginPlay() override;virtual void Tick(float DeltaSeconds) override;private://void SetCurrentSurvialGameModeState(EXMBSurvialGameModeState Instate);//UPROPERTY()EXMBSurvialGameModeState CurrentSurvialGameModeState;//UPROPERTY(BlueprintAssignable,BlueprintCallable)FOnSurvialGameModeStateChanged OnSurvialGameModeStateChanged;};
// Fill out your copyright notice in the Description page of Project Settings.#include "GameMode/XMBSurvialGameMode.h"void AXMBSurvialGameMode::BeginPlay()
{Super::BeginPlay();
}void AXMBSurvialGameMode::Tick(float DeltaSeconds)
{Super::Tick(DeltaSeconds);
}void AXMBSurvialGameMode::SetCurrentSurvialGameModeState(EXMBSurvialGameModeState Instate)
{CurrentSurvialGameModeState = Instate;OnSurvialGameModeStateChanged.Broadcast(CurrentSurvialGameModeState);
}
然后更换地图里的gamemode
2。接下来制作敌人来袭波数的定义
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Character/EnemyBase.h"
#include "GameMode/XMBGameModeBase.h"
#include "XMBSurvialGameMode.generated.h"UENUM(BlueprintType)
enum class EXMBSurvialGameModeState : uint8
{WaitSpawnNewWava,SpawningNewWava,InProgress,WaveComleted,AllWavesDonw,PlayerDied
};//敌人波数的信息
USTRUCT(BlueprintType)
struct FXMBEnemyWaveSpawnerInfo
{GENERATED_BODY()UPROPERTY(EditDefaultsOnly)TSoftClassPtr<AEnemyBase> SoftEnemyClassToSpawn;UPROPERTY(EditAnywhere)int32 MinPerSpawnCount = 1;UPROPERTY(EditAnywhere)int32 MaxPerSpawnCount = 1;};//敌人波数定义
USTRUCT(BlueprintType)
struct FXMBEnemyWaveSpawnerTableRow : public FTableRowBase
{GENERATED_BODY()UPROPERTY(EditAnywhere)TArray<FXMBEnemyWaveSpawnerInfo> EnemyWaveSpawnerDefinitions;UPROPERTY(EditAnywhere)int32 TotalEnemyToSpawnThisWave = 1;};//广播当前敌人攻击波数
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSurvialGameModeStateChanged, EXMBSurvialGameModeState, CurrentState);/*** */
UCLASS()
class ARPG_GRIVITY_API AXMBSurvialGameMode : public AXMBGameModeBase
{GENERATED_BODY()protected:virtual void BeginPlay() override;virtual void Tick(float DeltaSeconds) override;private://void SetCurrentSurvialGameModeState(EXMBSurvialGameModeState Instate);//当前波数UPROPERTY()EXMBSurvialGameModeState CurrentSurvialGameModeState;//波数委托UPROPERTY(BlueprintAssignable,BlueprintCallable)FOnSurvialGameModeStateChanged OnSurvialGameModeStateChanged;//敌人波数的表格UPROPERTY(EditDefaultsOnly,BlueprintReadOnly, Category = "WaveDefinition", meta = (AllowPrivateAccess = "true"))UDataTable* EnemyWaveSpawnerDataTable;};
然后创建数据表格
2。继续设置与波数有关的配置
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Character/EnemyBase.h"
#include "GameMode/XMBGameModeBase.h"
#include "XMBSurvialGameMode.generated.h"UENUM(BlueprintType)
enum class EXMBSurvialGameModeState : uint8
{WaitSpawnNewWava,SpawningNewWava,InProgress,WaveCompleted,AllWavesDown,PlayerDied
};//敌人波数的信息
USTRUCT(BlueprintType)
struct FXMBEnemyWaveSpawnerInfo
{GENERATED_BODY()UPROPERTY(EditDefaultsOnly)TSoftClassPtr<AEnemyBase> SoftEnemyClassToSpawn;UPROPERTY(EditAnywhere)int32 MinPerSpawnCount = 1;UPROPERTY(EditAnywhere)int32 MaxPerSpawnCount = 1;};//敌人波数定义
USTRUCT(BlueprintType)
struct FXMBEnemyWaveSpawnerTableRow : public FTableRowBase
{GENERATED_BODY()UPROPERTY(EditAnywhere)TArray<FXMBEnemyWaveSpawnerInfo> EnemyWaveSpawnerDefinitions;UPROPERTY(EditAnywhere)int32 TotalEnemyToSpawnThisWave = 1;};//广播当前敌人攻击波数
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSurvialGameModeStateChanged, EXMBSurvialGameModeState, CurrentState);/*** */
UCLASS()
class ARPG_GRIVITY_API AXMBSurvialGameMode : public AXMBGameModeBase
{GENERATED_BODY()protected:virtual void BeginPlay() override;virtual void Tick(float DeltaTime) override;private://void SetCurrentSurvialGameModeState(EXMBSurvialGameModeState Instate);//判断是否完成当前波数bool HasFinishedAllWaves() const;//当前波数UPROPERTY()EXMBSurvialGameModeState CurrentSurvialGameModeState;//波数委托UPROPERTY(BlueprintAssignable,BlueprintCallable)FOnSurvialGameModeStateChanged OnSurvialGameModeStateChanged;//敌人波数的表格UPROPERTY(EditDefaultsOnly,BlueprintReadOnly, Category = "WaveDefinition", meta = (AllowPrivateAccess = "true"))UDataTable* EnemyWaveSpawnerDataTable;//生成前的倒计时UPROPERTY(EditDefaultsOnly,BlueprintReadOnly, Category = "WaveDefinition", meta = (AllowPrivateAccess = "true"))float SpawnNewWavesWaitTime = 5.f;//到达下一波的时间UPROPERTY(EditDefaultsOnly,BlueprintReadOnly, Category = "WaveDefinition", meta = (AllowPrivateAccess = "true")) float WaveCompletedWaitTime = 5.f;//总共袭击波数UPROPERTY(VisibleDefaultsOnly,BlueprintReadOnly, Category = "WaveDefinition", meta = (AllowPrivateAccess = "true"))int32 TotalWavesToSpawn;//生成敌人的延迟,用于处理uiUPROPERTY(VisibleDefaultsOnly,BlueprintReadOnly, Category = "WaveDefinition", meta = (AllowPrivateAccess = "true"))float SpawnEnemiesDelayTime = 2.f;//当前敌人波数UPROPERTY(VisibleDefaultsOnly,BlueprintReadOnly, Category = "WaveDefinition", meta = (AllowPrivateAccess = "true"))int32 CurrentWaveCount = 1;//记录经过了多长时间UPROPERTY()float TimePassedSinceStart = 0.f;
};
// Fill out your copyright notice in the Description page of Project Settings.#include "GameMode/XMBSurvialGameMode.h"void AXMBSurvialGameMode::BeginPlay()
{Super::BeginPlay();checkf(EnemyWaveSpawnerDataTable,TEXT("Forgot to assign a valid datat table in survial game mode blueprint"));SetCurrentSurvialGameModeState(EXMBSurvialGameModeState::WaitSpawnNewWava);//TotalWavesToSpawn = EnemyWaveSpawnerDataTable->GetRowNames().Num();
}void AXMBSurvialGameMode::Tick(float DeltaTime)
{Super::Tick(DeltaTime);//检查是否处于等待状态if (CurrentSurvialGameModeState == EXMBSurvialGameModeState::WaitSpawnNewWava){TimePassedSinceStart += DeltaTime;//时间到了,要到下一波if (TimePassedSinceStart >= SpawnNewWavesWaitTime){TimePassedSinceStart = 0.f;SetCurrentSurvialGameModeState(EXMBSurvialGameModeState::SpawningNewWava);}}//检查是否处于正在进行时if (CurrentSurvialGameModeState == EXMBSurvialGameModeState::SpawningNewWava){TimePassedSinceStart += DeltaTime;if (TimePassedSinceStart >= SpawnEnemiesDelayTime){//TODO: Handle spawn new enemiesTimePassedSinceStart = 0.f;SetCurrentSurvialGameModeState(EXMBSurvialGameModeState::InProgress);}}//检查是否处于进行中if (CurrentSurvialGameModeState == EXMBSurvialGameModeState::InProgress){TimePassedSinceStart += DeltaTime;if (TimePassedSinceStart >= WaveCompletedWaitTime){TimePassedSinceStart = 0.f;CurrentWaveCount++;//检查是否完成if (HasFinishedAllWaves()){SetCurrentSurvialGameModeState(EXMBSurvialGameModeState::AllWavesDown);}else{SetCurrentSurvialGameModeState(EXMBSurvialGameModeState::WaitSpawnNewWava);}}}}void AXMBSurvialGameMode::SetCurrentSurvialGameModeState(EXMBSurvialGameModeState Instate)
{CurrentSurvialGameModeState = Instate;OnSurvialGameModeStateChanged.Broadcast(CurrentSurvialGameModeState);
}bool AXMBSurvialGameMode::HasFinishedAllWaves() const
{return CurrentWaveCount > TotalWavesToSpawn;
}