Hi, I have a class that calls this function on game start and tries to make a spline for ground terrain in my game. However, nothing is appearing. There is an Actor spawning called “Terrain” which is expected however I cannot see anything in game. Any ideas what is wrong with my function?
void AOSMProcessor::SpawnTerrain()
{
// Define the corner points based on Min and Max
FVector BottomLeft(MinX, MinY, 0);
FVector BottomRight(MaxX, MinY, 0);
FVector TopRight(MaxX, MaxY, 0);
FVector TopLeft(MinX, MaxY, 0);
// Debug log for corner points
UE_LOG(LogTemp, Warning, TEXT("BottomLeft: %s"), *BottomLeft.ToString());
UE_LOG(LogTemp, Warning, TEXT("BottomRight: %s"), *BottomRight.ToString());
UE_LOG(LogTemp, Warning, TEXT("TopRight: %s"), *TopRight.ToString());
UE_LOG(LogTemp, Warning, TEXT("TopLeft: %s"), *TopLeft.ToString());
// Create a new actor for the terrain
AActor* TerrainActor = GetWorld()->SpawnActor<AActor>(AActor::StaticClass(), FVector::ZeroVector, FRotator::ZeroRotator);
TerrainActor->SetActorHiddenInGame(false); // Ensure it's visible
TerrainActor->AttachToActor(this, FAttachmentTransformRules::KeepRelativeTransform);
TerrainActor->SetActorLabel("Terrain");
// Create a spline component and attach it to the actor
USplineComponent* TerrainSpline = NewObject<USplineComponent>(TerrainActor);
TerrainSpline->SetupAttachment(TerrainActor->GetRootComponent());
TerrainSpline->RegisterComponent();
TerrainSpline->SetMobility(EComponentMobility::Movable);
// Add points to the spline
TerrainSpline->AddSplinePoint(BottomLeft, ESplineCoordinateSpace::World);
TerrainSpline->AddSplinePoint(BottomRight, ESplineCoordinateSpace::World);
TerrainSpline->AddSplinePoint(TopRight, ESplineCoordinateSpace::World);
TerrainSpline->AddSplinePoint(TopLeft, ESplineCoordinateSpace::World);
TerrainSpline->AddSplinePoint(BottomLeft, ESplineCoordinateSpace::World);
TerrainSpline->SetClosedLoop(true);
TerrainSpline->UpdateSpline();
// Create spline mesh components along the spline
for (int32 i = 0; i < TerrainSpline->GetNumberOfSplinePoints() - 1; ++i)
{
USplineMeshComponent* SplineMesh = NewObject<USplineMeshComponent>(TerrainActor);
SplineMesh->SetupAttachment(TerrainSpline);
SplineMesh->SetMobility(EComponentMobility::Movable);
SplineMesh->RegisterComponent();
FVector StartPos = TerrainSpline->GetLocationAtSplinePoint(i, ESplineCoordinateSpace::World);
FVector EndPos = TerrainSpline->GetLocationAtSplinePoint(i + 1, ESplineCoordinateSpace::World);
// Set positions for the spline mesh
SplineMesh->SetStartAndEnd(StartPos, FVector::ZeroVector, EndPos, FVector::ZeroVector);
// Create and set a green material for the floor
UMaterialInstanceDynamic* DynamicMaterial = UMaterialInstanceDynamic::Create(DebugMaterial, this);
DynamicMaterial->SetVectorParameterValue(TEXT("Color"), FLinearColor::Green);
SplineMesh->SetMaterial(0, DynamicMaterial);
}
}
Variables MinX, MaxX, MinY and MaxY are defined elsewhere with sensible values.