Ok, so based on rantrod’s help, the following code worked. In summary, I had to use AttachRootComponentTo in order to line up the docks, then I used a physics constraint actor to actually make the connection. It should be enough to weld the elements together once they are lined up, but that part I still can’t get to work. Thanks!:
connections[modules[0]->GetIDNumber()][BACK_DOCK] = modules[1]->GetDocks()[FRONT_DOCK];
connections[modules[1]->GetIDNumber()][FRONT_DOCK] = modules[0]->GetDocks()[BACK_DOCK];
modules[0]->SetDockEngaged(BACK_DOCK, true);
modules[1]->SetDockEngaged(FRONT_DOCK, true);
modules[0]->AttachRootComponentTo(modules[1]->GetRootComponent(),"",EAttachLocation::SnapToTarget, true);
modules[0]->GetRootComponent()->SetRelativeRotation(FRotator(0,0,0));
modules[0]->GetRootComponent()->SetRelativeLocation(FVector(0,0,190));
modules[0]->WeldDockToComponent(BACK_DOCK, modules[1]->GetDockComponent(FRONT_DOCK));
APhysicsConstraintActor *a = GetWorld()->SpawnActor<APhysicsConstraintActor>();
a->GetConstraintComp()->SetConstrainedComponents(modules[0]->GetSlaveOuterMesh(), "BackDock", modules[1]->GetMasterOuterMesh(), "FrontDock");
a->GetConstraintComp()->SetLinearXLimit(ELinearConstraintMotion::LCM_Locked, 0);
a->GetConstraintComp()->SetLinearYLimit(ELinearConstraintMotion::LCM_Locked, 0);
a->GetConstraintComp()->SetLinearZLimit(ELinearConstraintMotion::LCM_Locked, 0);
a->GetConstraintComp()->SetAngularSwing1Limit(EAngularConstraintMotion::ACM_Locked, 0);
a->GetConstraintComp()->SetAngularSwing2Limit(EAngularConstraintMotion::ACM_Locked, 0);
a->GetConstraintComp()->SetAngularTwistLimit(EAngularConstraintMotion::ACM_Locked, 0);