Hello !
I’m creating a StaticMesh at runtime, but there’s no collision at all in packaged mode, and I’m quite stuck (it works fine in Editor). All given solutions to similar problems I found didn’t work for me.
Here is what I’m doing :
- I have an AActor placed in my scene for the terrain/landscape, with a default flat “prebuilt” plane StaticMesh attached its StaticMeshComponent. I’m enabling Collision for Query only (what I want), and Block on wanted CollisionResponseChannel. This one works fine even in Packaged version.
ATerrain::ATerrain()
{
//...
DefaultTerrainStaticMesh = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/TerrainLoader/SM_DefaultTerrain.SM_DefaultTerrain'")).Object;
//...
}
void ATerrain::BeginPlay()
{
//...
SMComponent = static_cast<UStaticMeshComponent*>(GetComponentByClass(UStaticMeshComponent::StaticClass()));
SMComponent->SetCollisionEnabled(ECollisionEnabled::Query);
SMComponent->SetCollisionResponseToChannel(GROUND_OBJECT_TYPE_CHANNEL, ECR_Block);
ResetTerrain();
//...
}
void ATerrain::ResetTerrain() const
{
SMComponent->SetStaticMesh(DefaultTerrainStaticMesh);
}
- I load some files and create a new StaticMesh based on data in it for a new Terrain
→ For this, I utilize FMeshDescription, FMeshDescriptionBuilder, FBuildMeshDescriptionsParams and other few tools, since I build my StaticMesh vertex per vertex. (I hope I didn’t cut something important)
TOptional<UStaticMesh*> FTerrainHelper::GenerateMesh(...) const
{
//...
FMeshDescription MeshDesc;
FStaticMeshAttributes Attributes(MeshDesc);
Attributes.Register();
FMeshDescriptionBuilder MeshDescBuilder;
MeshDescBuilder.SetMeshDescription( &MeshDesc );
//... Vertices and triangles computing
UStaticMesh* StaticMesh = NewObject<UStaticMesh>();
UStaticMesh::FBuildMeshDescriptionsParams MdParams;
MdParams.bBuildSimpleCollision = true;
MdParams.bFastBuild = true;
TArray<const FMeshDescription*> MeshDescriptions;
MeshDescriptions.Emplace(&MeshDesc);
StaticMesh ->BuildFromMeshDescriptions(MeshDescriptions, MdParams);
return StaticMesh;
}
- Once I created the new StaticMesh, I set it on my already existing StaticMeshComponent
void ATerrain::GenerateTerrain(...) const
{
TOptional<UStaticMesh*> StaticMesh = TerrainHelper->GenerateMesh(...);
if(StaticMesh.IsSet())
{
SMComponent->SetStaticMesh(StaticMesh.GetValue());
}
//...
}
… and it doesn’t work on packaged version. No collision ever is detected on my newly created Terrain (I click on it to place points or objects, and no reaction). But it works perfectly fine in Editor
I have the solution to use a DynamicMesh instead, but those are quite expensive and the Terrain may be… big. And since I don’t need to edit it once it’s created, StaticMesh would be the way to go I think.
Someone has an idea regarding how to fix this ? Or what the Editor is doing and I need to “reproduce” ?
Thanks :o