1515#include " JsonUtilities.h"
1616#include " Misc/FileHelper.h"
1717#include " Misc/Paths.h"
18+ #include " Engine/StaticMeshActor.h"
19+ #include " Components/StaticMeshComponent.h"
1820#include < util/ue-header-guard-end.h>
1921
2022TArray<FActorDefinition> APropActorFactory::GetDefinitions ()
2123{
2224 LoadPropParametersArrayFromFile (" PropParameters.json" , PropsParams);
23-
25+
2426 UActorBlueprintFunctionLibrary::MakePropDefinitions (PropsParams, Definitions);
2527 return Definitions;
2628}
@@ -37,22 +39,77 @@ FActorSpawnResult APropActorFactory::SpawnActor(
3739 return SpawnResult;
3840 }
3941
40- AActor* SpawnedActor = GetWorld ()->SpawnActor <AActor>(ActorDescription.Class , SpawnAtTransform);
41- SpawnResult.Actor = SpawnedActor;
42+ FActorSpawnParameters SpawnParameters;
43+ SpawnParameters.SpawnCollisionHandlingOverride =
44+ ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
45+
46+ AStaticMeshActor* StaticMeshActor = GetWorld ()->SpawnActor <AStaticMeshActor>(
47+ ActorDescription.Class , SpawnAtTransform, SpawnParameters);
48+
49+ SpawnResult.Actor = StaticMeshActor;
4250
43- if (SpawnedActor == nullptr )
51+ if (StaticMeshActor == nullptr )
4452 {
4553 SpawnResult.Status = EActorSpawnResultStatus::Collision;
4654 return SpawnResult;
4755 }
4856
49- if (PostProcessProp (SpawnedActor, ActorDescription))
57+ UStaticMeshComponent* StaticMeshComponent = Cast<UStaticMeshComponent>(
58+ StaticMeshActor->GetRootComponent ());
59+
60+ if (!StaticMeshComponent)
61+ {
62+ UE_LOG (LogCarla, Error, TEXT (" Prop spawn failed: StaticMeshComponent is null for actor %s" ),
63+ *ActorDescription.Id );
64+ StaticMeshActor->Destroy ();
65+ SpawnResult.Status = EActorSpawnResultStatus::UnknownError;
66+ return SpawnResult;
67+ }
68+
69+ if (!ActorDescription.Variations .Contains (" mesh_path" ))
70+ {
71+ UE_LOG (LogCarla, Error, TEXT (" Prop spawn failed: No mesh_path variation found for actor %s" ),
72+ *ActorDescription.Id );
73+ StaticMeshActor->Destroy ();
74+ SpawnResult.Status = EActorSpawnResultStatus::InvalidDescription;
75+ return SpawnResult;
76+ }
77+
78+ FString MeshPath = UActorBlueprintFunctionLibrary::ActorAttributeToString (
79+ ActorDescription.Variations [" mesh_path" ], " " );
80+
81+ if (MeshPath.IsEmpty ())
82+ {
83+ UE_LOG (LogCarla, Error, TEXT (" Prop spawn failed: mesh_path is empty for actor %s" ),
84+ *ActorDescription.Id );
85+ StaticMeshActor->Destroy ();
86+ SpawnResult.Status = EActorSpawnResultStatus::InvalidDescription;
87+ return SpawnResult;
88+ }
89+
90+ UStaticMesh* Mesh = LoadObject<UStaticMesh>(nullptr , *MeshPath);
91+ if (Mesh == nullptr )
92+ {
93+ UE_LOG (LogCarla, Error, TEXT (" Prop spawn failed: Failed to load mesh '%s' for actor %s" ),
94+ *MeshPath, *ActorDescription.Id );
95+ StaticMeshActor->Destroy ();
96+ SpawnResult.Status = EActorSpawnResultStatus::UnknownError;
97+ return SpawnResult;
98+ }
99+
100+ StaticMeshComponent->SetMobility (EComponentMobility::Movable);
101+ if (!StaticMeshComponent->SetStaticMesh (Mesh))
50102 {
51- SpawnResult.Status = EActorSpawnResultStatus::Success;
103+ UE_LOG (LogCarla, Error, TEXT (" Prop spawn failed: Failed to set mesh '%s' for actor %s" ),
104+ *MeshPath, *ActorDescription.Id );
105+ StaticMeshActor->Destroy ();
106+ SpawnResult.Status = EActorSpawnResultStatus::UnknownError;
52107 return SpawnResult;
53108 }
54109
55- SpawnResult.Status = EActorSpawnResultStatus::UnknownError;
110+ StaticMeshComponent->SetMobility (EComponentMobility::Static);
111+ PostProcessProp (StaticMeshActor, ActorDescription);
112+ SpawnResult.Status = EActorSpawnResultStatus::Success;
56113 return SpawnResult;
57114}
58115
@@ -226,4 +283,4 @@ void APropActorFactory::LoadPropParametersArrayFromFile(const FString& FileName,
226283 {
227284 UE_LOG (LogCarla, Error, TEXT (" Failed to load file: %s" ), *FilePath);
228285 }
229- }
286+ }
0 commit comments