Skip to content

Commit ed94430

Browse files
committed
Added a filter option to the prefab randomizer. Changed the default value of the prefab randomizer actor's RandomizeOnBeginPlay to false. Set this to true in the editor if you want them to randomize on begin play
1 parent 5e06b9f commit ed94430

File tree

4 files changed

+46
-8
lines changed

4 files changed

+46
-8
lines changed

Source/PrefabricatorRuntime/Private/Prefab/Random/PrefabRandomizerActor.cpp

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,23 @@ void APrefabRandomizer::Randomize(int32 InSeed)
9090
{
9191
Random.Initialize(InSeed);
9292

93-
// Grab all the actors in the level
93+
const bool bRandomizeEverythingInLevel = (ActorsToRandomize.Num() == 0);
94+
TArray<APrefabActor*> TargetActors;
9495
ULevel* CurrentLevel = GetLevel();
95-
TArray<APrefabActor*> AllPrefabsInLevel;
96-
GetActorsInLevel(CurrentLevel, AllPrefabsInLevel);
96+
if (bRandomizeEverythingInLevel) {
97+
// Grab all the actors in the level
98+
GetActorsInLevel(CurrentLevel, TargetActors);
99+
}
100+
else {
101+
TargetActors = ActorsToRandomize;
102+
}
97103

104+
if (TargetActors.Num() == 0) return;
105+
98106
// Build only the top level prefabs
99-
TArray<APrefabActor*> TopLevelPrefabs = AllPrefabsInLevel.FilterByPredicate([](APrefabActor* InPrefab) -> bool {
107+
TArray<APrefabActor*> TopLevelPrefabs = TargetActors.FilterByPredicate([](APrefabActor* InPrefab) -> bool {
100108
AActor* Parent = InPrefab->GetAttachParentActor();
101-
bool bChildOfAnotherPrefab = Parent && Parent->IsA<APrefabActor>();
109+
const bool bChildOfAnotherPrefab = Parent && Parent->IsA<APrefabActor>();
102110
return !bChildOfAnotherPrefab;
103111
});
104112

@@ -110,8 +118,25 @@ void APrefabRandomizer::Randomize(int32 InSeed)
110118
GetActorsInLevel(CurrentLevel, SeedLinkersInLevel);
111119
for (APrefabSeedLinker* SeedLinker : SeedLinkersInLevel) {
112120
SanitizeArray(SeedLinker->LinkedActors);
113-
if (SeedLinker->LinkedActors.Num() > 1) {
114-
int32 LinkedSeeds = SeedLinker->LinkedActors[0]->Seed;
121+
122+
// If we are randomizing only selected actors, check if the seed linker links to one of them
123+
bool bValidSeedLinker;
124+
if (!bRandomizeEverythingInLevel) {
125+
bValidSeedLinker = false;
126+
for (TWeakObjectPtr<APrefabActor> LinkedActor : SeedLinker->LinkedActors) {
127+
if (!LinkedActor.IsValid()) continue;
128+
if (TargetActors.Contains(LinkedActor)) {
129+
bValidSeedLinker = true;
130+
break;
131+
}
132+
}
133+
}
134+
else {
135+
bValidSeedLinker = true;
136+
}
137+
138+
if (bValidSeedLinker && SeedLinker->LinkedActors.Num() > 1) {
139+
const int32 LinkedSeeds = SeedLinker->LinkedActors[0]->Seed;
115140
for (int i = 1; i < SeedLinker->LinkedActors.Num(); i++) {
116141
SeedLinker->LinkedActors[i]->Seed = LinkedSeeds;
117142
}

Source/PrefabricatorRuntime/Private/Utils/PrefabricatorFunctionLibrary.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ void UPrefabricatorBlueprintLibrary::RandomizePrefab(APrefabActor* PrefabActor,
4343
FPrefabTools::LoadStateFromPrefabAsset(PrefabActor, LoadSettings);
4444
}
4545

46+
void UPrefabricatorBlueprintLibrary::UnlinkPrefab(APrefabActor* PrefabActor) {
47+
FPrefabTools::UnlinkAndDestroyPrefabActor(PrefabActor);
48+
}
49+
4650
void UPrefabricatorBlueprintLibrary::GetAllAttachedActors(AActor* Prefab, TArray<AActor*>& AttachedActors)
4751
{
4852
if (!Prefab) return;

Source/PrefabricatorRuntime/Public/Prefab/Random/PrefabRandomizerActor.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#pragma once
44
#include "CoreMinimal.h"
55
#include "GameFramework/Actor.h"
6+
#include "Prefab/PrefabActor.h"
7+
68
#include "PrefabRandomizerActor.generated.h"
79

810
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FPrefabRandomizerCompleteBindableEvent);
@@ -26,7 +28,7 @@ class PREFABRICATORRUNTIME_API APrefabRandomizer : public AActor {
2628

2729
public:
2830
UPROPERTY(EditAnywhere, Category = "Prefabricator")
29-
bool bRandomizeOnBeginPlay = true;
31+
bool bRandomizeOnBeginPlay = false;
3032

3133
UPROPERTY(EditAnywhere, Category = "Prefabricator")
3234
int32 SeedOffset = 0;
@@ -40,6 +42,10 @@ class PREFABRICATORRUNTIME_API APrefabRandomizer : public AActor {
4042
UPROPERTY(EditAnywhere, Category = "Prefabricator")
4143
bool bFastSyncBuild = false;
4244

45+
/** If left empty, everything in the level will be randomized. If set, only the actors in the list will be randomized. */
46+
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Prefabricator")
47+
TArray<APrefabActor*> ActorsToRandomize;
48+
4349
private:
4450
TSharedPtr<class FPrefabBuildSystem> BuildSystem;
4551
FRandomStream Random;

Source/PrefabricatorRuntime/Public/Utils/PrefabricatorFunctionLibrary.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ class PREFABRICATORRUNTIME_API UPrefabricatorBlueprintLibrary : public UBlueprin
2020
UFUNCTION(BlueprintCallable, Category = "Prefabricator")
2121
static void RandomizePrefab(APrefabActor* PrefabActor, const FRandomStream& InRandom);
2222

23+
UFUNCTION(BlueprintCallable, Category = "Prefabricator")
24+
static void UnlinkPrefab(APrefabActor* PrefabActor);
25+
2326
UFUNCTION(BlueprintCallable, Category = "Prefabricator")
2427
static void GetAllAttachedActors(AActor* Prefab, TArray<AActor*>& AttachedActors);
2528

0 commit comments

Comments
 (0)