// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "GameFramework/Actor.h" #include "Engine/World.h" #include "MassSpawnerTypes.h" #include "MassEntitySpawnDataGeneratorBase.h" #include "MassSpawner.generated.h" #define UE_API MASSSPAWNER_API class UBillboardComponent; struct FStreamableHandle; DECLARE_DYNAMIC_MULTICAST_DELEGATE(FMassSpawnerOnSpawningFinishedEvent); DECLARE_DYNAMIC_MULTICAST_DELEGATE(FMassSpawnerOnDespawningFinishedEvent); /** A spawner you can put on a map and configure it to spawn different things */ UCLASS(MinimalAPI, hidecategories = (Object, Actor, Input, Rendering, LOD, Cooking, Collision, HLOD, Partition)) class AMassSpawner : public AActor { GENERATED_BODY() public: UE_API AMassSpawner(); protected: UE_API virtual void BeginPlay() override; UE_API virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; UE_API virtual void PostLoad() override; UE_API virtual void PostRegisterAllComponents() override; UE_API virtual void BeginDestroy() override; public: #if WITH_EDITOR UFUNCTION(BlueprintCallable, CallInEditor, Category = "Debug") UE_API void DEBUG_Spawn(); /** Remove all the entities */ UFUNCTION(BlueprintCallable, CallInEditor, Category = "Debug") UE_API void DEBUG_Clear(); #endif // WITH_EDITOR protected: #if WITH_EDITOR UE_API virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; #endif // WITH_EDITOR UE_API void RegisterEntityTemplates(); public: /** * Starts the spawning of all the agent types of this spawner */ UFUNCTION(BlueprintCallable, Category = "Spawning") UE_API void DoSpawning(); /** * Despawn all mass agent that was spawned by this spawner */ UFUNCTION(BlueprintCallable, Category = "Spawning") UE_API void DoDespawning(); /** * Despawn all mass agent that was spawned by this spawner, except EntitiesToIgnore. * * Any EntitiesToIgnore previously spawned by this spawner will remain spawned and tracked by this spawner. */ UE_API void DoDespawning(TConstArrayView EntitiesToIgnore); UFUNCTION(BlueprintCallable, Category = "Spawning") UE_API void ClearTemplates(); UFUNCTION(BlueprintCallable, Category = "Spawning") UE_API void UnloadConfig(); /** * If given entity has been spawned by this MassSpawner instance then it will get destroyed and all the book keeping * updated. Otherwise the call has no effect. * @return true if the entity got removed. False otherwise. */ UE_API bool DespawnEntity(const FMassEntityHandle Entity); /** * Scales the spawning counts * @param Scale is the number to multiply the all counts of each agent types */ UFUNCTION(BlueprintCallable, Category = "Spawning") void ScaleSpawningCount(float Scale) { SpawningCountScale = Scale; } UFUNCTION(BlueprintCallable, Category = "Spawning") UE_API int32 GetCount() const; UFUNCTION(BlueprintCallable, Category = "Spawning") UE_API float GetSpawningCountScale() const; /** Called once DoSpawning completes and all entities have been spawned. */ UPROPERTY(BlueprintAssignable) FMassSpawnerOnSpawningFinishedEvent OnSpawningFinishedEvent; /** Called once DoDespawning completes and all mass agents spawned by this spawner have been despawned. */ UPROPERTY(BlueprintAssignable) FMassSpawnerOnDespawningFinishedEvent OnDespawningFinishedEvent; protected: UE_API void OnPostWorldInit(UWorld* World, const UWorld::InitializationValues); UE_API void SpawnGeneratedEntities(TConstArrayView Results); UE_API void OnSpawnDataGenerationFinished(TConstArrayView Results, FMassSpawnDataGenerator* FinishedGenerator); UE_API int32 GetSpawnCount() const; UE_API UMassProcessor* GetPostSpawnProcessor(TSubclassOf ProcessorClass); protected: struct FSpawnedEntities { FMassEntityTemplateID TemplateID; TArray Entities; }; UPROPERTY(EditAnywhere, Category = "Mass|Spawn") int32 Count; /** Array of entity types to spawn. These define which entities to spawn. */ UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Mass|Spawn") TArray EntityTypes; /** Array of entity spawn generators. These define where to spawn entities. */ UPROPERTY(EditAnywhere, Category = "Mass|Spawn") TArray SpawnDataGenerators; UPROPERTY(Category = "Mass|Spawn", EditAnywhere) uint32 bAutoSpawnOnBeginPlay : 1; /** By default TickSchematics will be appended to the simulation's schematics. If this property is set to true the * TickSchematics will override the original simulation schematics */ UPROPERTY(Category = "Mass|Simulation", EditAnywhere) uint32 bOverrideSchematics : 1; UPROPERTY() TArray> PostSpawnProcessors; /** Scale of the spawning count */ UPROPERTY(EditAnywhere, Category = "Mass|Spawn") float SpawningCountScale = 1.0f; FDelegateHandle SimulationStartedHandle; FDelegateHandle OnPostWorldInitDelegateHandle; TArray AllSpawnedEntities; TArray AllGeneratedResults; TSharedPtr StreamingHandle; #if WITH_EDITORONLY_DATA private: UPROPERTY() TObjectPtr SpriteComponent; #endif // WITH_EDITORONLY_DATA }; namespace UE::MassSpawner { MASSSPAWNER_API extern float ScalabilitySpawnDensityMultiplier; } #undef UE_API