Thank you for the well thought out reply, and I don’t blame you for copy-pasting. For some reason I have it in my mind using FConstructorStatics and storing references is a lot of overhead, given I have 36 objects will all be storing those references. Is the best option really to have the logic for preloading and deciding the meshes and materials in a manager class?
So I suppose that part is still in question. That code for instance would be
struct FConstructorStatics
{
ConstructorHelpers::FObjectFinderOptional<UStaticMesh> BenchMesh;
ConstructorHelpers::FObjectFinderOptional<UStaticMesh> GrassMesh;
ConstructorHelpers::FObjectFinderOptional<UStaticMesh> RockMesh;
ConstructorHelpers::FObjectFinderOptional<UMaterialInstance> ObjectMaterial;
FConstructorStatics()
: BenchMesh(TEXT("/Game/Meshes/Park/Mesh_Bench.Mesh_Bench"))
, GrassMesh(TEXT("/Game/Meshes/Park/Mesh_Grass1.Mesh_Grass1"))
, RockMesh(TEXT("/Game/Meshes/Park/Mesh_Rock1.Mesh_Rock1"))
, ObjectMaterial(TEXT("/Game/Materials/Park/MI_Park.MI_Park"))
{
}
};
static FConstructorStatics ConstructorStatics;
BenchMesh = ConstructorStatics.BenchMesh.Get();
GrassMesh = ConstructorStatics.GrassMesh.Get();
RockMesh = ConstructorStatics.RockMesh.Get();
int objectId = FMath::RandRange(0, 2);
switch (objectId)
{
case 0:
ObjectMesh->SetStaticMesh(BenchMesh);
break;
// ETC
}
But then I end up with lots of cruft references (from the header file)
UPROPERTY()
class UStaticMeshComponent* ObjectMesh;
UPROPERTY()
class UStaticMesh* BenchMesh;
UPROPERTY()
class UStaticMesh* GrassMesh;
UPROPERTY()
class UStaticMesh* RockMesh;
UPROPERTY()
class UMaterialInstance* ObjectMaterial;
But yes doing it this way did resolve my issue!