ProceduralMesh to StaticMesh Problem

Hello,
i use this Function from the Engine Source: (Original Name is “ClickedOnConvertToStaticMesh”)

UStaticMesh* ACube::CreateStaticMeshFromProcMesh(TArray<UQuad*> &ProcMeshComponent)
{

	//UStaticMesh = UStaticMesh::create

	// Find first selected ProcMeshComp

	FString ActorName = FString(TEXT("Me"));
	FString LevelName = FString(TEXT("VoxelWorld"));
	FString AssetName = FString(TEXT("SM_")) + LevelName + FString(TEXT("_") + ActorName);
	FString PathName = FString(TEXT("/Game/Meshes/"));
	FString PackageName = PathName + AssetName;

	// Raw mesh data we are filling in
	FRawMesh RawMesh;
	// Materials to apply to new mesh
	TArray<UMaterialInterface*> MeshMaterials;

	const int32 NumSections = 6;
	int32 VertexBase = 0;
	for (int32 SectionIdx = 0; SectionIdx < NumSections; SectionIdx++)
	{
		FProcMeshSection* ProcSection = ProcMeshComponent[SectionIdx]->GetProcMeshSection(0);

		// Copy verts
		for (FProcMeshVertex& Vert : ProcSection->ProcVertexBuffer)
		{
			RawMesh.VertexPositions.Add(Vert.Position);
		}

		// Copy 'wedge' info
		int32 NumIndices = ProcSection->ProcIndexBuffer.Num();
		for (int32 IndexIdx = 0; IndexIdx < NumIndices; IndexIdx++)
		{
			int32 Index = ProcSection->ProcIndexBuffer[IndexIdx];

			RawMesh.WedgeIndices.Add(Index + VertexBase);

			FProcMeshVertex& ProcVertex = ProcSection->ProcVertexBuffer[Index];

			FVector TangentX = ProcVertex.Tangent.TangentX;
			FVector TangentZ = ProcVertex.Normal;
			FVector TangentY = (TangentX ^ TangentZ).GetSafeNormal() * (ProcVertex.Tangent.bFlipTangentY ? -1.f : 1.f);

			RawMesh.WedgeTangentX.Add(TangentX);
			RawMesh.WedgeTangentY.Add(TangentY);
			RawMesh.WedgeTangentZ.Add(TangentZ);

			RawMesh.WedgeTexCoords[0].Add(ProcVertex.UV0);
			RawMesh.WedgeColors.Add(ProcVertex.Color);
		}

		// copy face info
		int32 NumTris = NumIndices / 3;
		for (int32 TriIdx = 0; TriIdx < NumTris; TriIdx++)
		{
			RawMesh.FaceMaterialIndices.Add(SectionIdx);
			RawMesh.FaceSmoothingMasks.Add(0); // Assume this is ignored as bRecomputeNormals is false
		}

		// Remember material
		MeshMaterials.Add(ProcMeshComponent[SectionIdx]->GetMaterial(0));

		// Update offset for creating one big index/vertex buffer
		VertexBase += ProcSection->ProcVertexBuffer.Num();
	}
	// If we got some valid data.
	if (RawMesh.VertexPositions.Num() > 3 && RawMesh.WedgeIndices.Num() > 3)
	{
		// Then find/create it.
		UPackage* Package = CreatePackage(NULL, *PackageName);
		check(Package);

		// Create StaticMesh object if Asset File is needed change "this" to Package
		UStaticMesh* StaticMesh = NewObject<UStaticMesh>(Package, FName(*AssetName), RF_Public | RF_Standalone);
		StaticMesh->InitResources();

		StaticMesh->LightingGuid = FGuid::NewGuid();

		// Add source to new StaticMesh
		FStaticMeshSourceModel* SrcModel = new (StaticMesh->SourceModels) FStaticMeshSourceModel();
		SrcModel->BuildSettings.bRecomputeNormals = false;
		SrcModel->BuildSettings.bRecomputeTangents = false;
		SrcModel->BuildSettings.bRemoveDegenerates = false;
		SrcModel->BuildSettings.bUseHighPrecisionTangentBasis = false;
		SrcModel->BuildSettings.bUseFullPrecisionUVs = false;
		SrcModel->BuildSettings.bGenerateLightmapUVs = true;
		SrcModel->BuildSettings.SrcLightmapIndex = 0;
		SrcModel->BuildSettings.DstLightmapIndex = 1;
		SrcModel->RawMeshBulkData->SaveRawMesh(RawMesh);
		

		// Copy materials to new mesh
		for (UMaterialInterface* Material : MeshMaterials)
		{
			StaticMesh->StaticMaterials.Add(FStaticMaterial(Material));
		}

		//Set the Imported version before calling the build
		StaticMesh->ImportVersion = EImportStaticMeshVersion::LastVersion;


		// Build mesh from source
		StaticMesh->Build(false);
		StaticMesh->PostEditChange();

		// Notify asset registry of new asset
		FAssetRegistryModule::AssetCreated(StaticMesh);
		
		return StaticMesh;
	}
	else
		return nullptr;
}

I edited some Parts. It works greate, the StaticMesh is saved and is useable as an Asset.
The big Problem is that the returned StaticMesh is not useable. e.g. in a StaticMeshComponent.

testMeshComponent->SetStaticMesh(StaticMesh);

It keeps crashing the Editor. I thought it may not return a invalid Pointer. But everything is fine.

OK! After looking at the code for ever. I figured out whats wrong…
I forget to create an Object of the StaticMeshComponent.

testMesh = NewObject<UStaticMeshComponent>(this, TEXT("ComponentName"));

this Line solved the Crashing :smiley: