Hello. I’m having the following issue when the program is stopped, apparently is an error in the destructor of an actor that have a static mesh subcomponent.
In the constructor I’m allocating a static mesh from the information of an existing static mesh:
ACreadorLuces::ACreadorLuces()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
// Carga del material
static ConstructorHelpers::FObjectFinder<UMaterial> MatObj(TEXT("Material'/Game/Materiales/MaterialEjemplo.MaterialEjemplo'"));
if (MatObj.Succeeded()){
BaseMat = MatObj.Object;
}
static ConstructorHelpers::FObjectFinder<UStaticMesh> cargadorModelo(TEXT("/Game/Modelos/basico_mm"));
UStaticMesh* modelo;
if (cargadorModelo.Succeeded()){
modelo = cargadorModelo.Object;
}
else {
return;
}
FStaticMeshSourceModel* sourceModel = &modelo->SourceModels[0];
FRawMesh rawMesh;
sourceModel->RawMeshBulkData->LoadRawMesh(rawMesh);
for (int32 i = 0; i < rawMesh.FaceMaterialIndices.Num(); i++){
rawMesh.FaceMaterialIndices[i] = 0;
}
// Creo nuevo modelo
UStaticMesh* modeloNuevo = NewObject<UStaticMesh>();
new(modeloNuevo->SourceModels) FStaticMeshSourceModel();
modeloNuevo->SourceModels[0].RawMeshBulkData->SaveRawMesh(rawMesh);
TArray<FText> BuildErrorsNuevo;
modeloNuevo->Build(true, &BuildErrorsNuevo);
modeloNuevo->MarkPackageDirty();
// Asigno nuevo modelo
modeloActor = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ModeloActor"));
modeloActor->SetStaticMesh(modeloNuevo);
}
.h:
class BOTONLUZ_API ACreadorLuces : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ACreadorLuces();
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick(float DeltaSeconds) override;
virtual void PostInitializeComponents() override;
UPROPERTY(Category = StaticMeshActor, VisibleAnywhere, BlueprintReadOnly,
Meta = (ExposeFunctionCategories = "Mesh,Rendering,Physics,Components|StaticMesh", AllowPrivateAccess = "true"))
UStaticMeshComponent * modeloActor;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Materials)
UMaterial* BaseMat;
};
The problem is here, in the PostInitializeComponents function, because if I remove this function the Engine doesn’t crash. Maybe it’s related to the dynamic material instances:
void ACreadorLuces::PostInitializeComponents()
{
Super::PostInitializeComponents();
string s;
if (!errorCargaModelo){
if (BaseMat)
{
// Creo y agrego materiales a la lista del modelo
MaterialInst = UMaterialInstanceDynamic::Create(BaseMat, this);
modeloActor->SetMaterial(1, MaterialInst);
FLinearColor color1 = FLinearColor::Yellow;
MaterialInst->SetVectorParameterValue("baseColor", color1);
MaterialInst = UMaterialInstanceDynamic::Create(BaseMat, this);
modeloActor->SetMaterial(2, MaterialInst);
FLinearColor color2 = FLinearColor::Black;
MaterialInst->SetVectorParameterValue("baseColor", color2);
// Obtengo y modifico rawmesh
FStaticMeshSourceModel sourceModel = modeloActor->StaticMesh->SourceModels[0];
FRawMesh rawMesh;
sourceModel.RawMeshBulkData->LoadRawMesh(rawMesh);
for (int32 i = 0; i < rawMesh.FaceMaterialIndices.Num(); i++){
rawMesh.FaceMaterialIndices[i] = 1;
}
modeloActor->StaticMesh->SourceModels[0].RawMeshBulkData->SaveRawMesh(rawMesh);
modeloActor->StaticMesh->PreEditChange(nullptr);
TArray<FText> BuildErrors;
modeloActor->StaticMesh->Build(true, &BuildErrors);
modeloActor->StaticMesh->MarkPackageDirty();
}
}
else {
s = "Error al cargar modelo";
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, s.c_str());
}
}
Crash report:
MachineId:D2BEF611456171CB171D15A4A42CB182
EpicAccountId:6ac59fa8cbb647a4b14c5a548cbd3b91
Unknown exception - code 00000001 (first/second chance not available)
"Assertion failed: LockStatus == LOCKSTATUS_Unlocked [File:D:\BuildFarm\buildmachine_++depot+UE4-Releases+4.9\Engine\Source\Runtime\CoreUObject\Private\Seria
UE4Editor_Core!FDebug::AssertFailed() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\core\private\misc\outputdevice.cpp:354]
UE4Editor_CoreUObject!FUntypedBulkData::~FUntypedBulkData() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\coreuobject\private\serialization\bulkdata.cpp:125]
UE4Editor_Engine!TArray<FStaticMeshSourceModel,FDefaultAllocator>::~TArray<FStaticMeshSourceModel,FDefaultAllocator>() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\core\public\containers\array.h:577]
UE4Editor_Engine!UStaticMesh::~UStaticMesh()
UE4Editor_Engine!UStaticMesh::`scalar deleting destructor'()
UE4Editor_CoreUObject!IncrementalPurgeGarbage() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\coreuobject\private\uobject\garbagecollection.cpp:1152]
UE4Editor_CoreUObject!CollectGarbageInternal() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\coreuobject\private\uobject\garbagecollection.cpp:1383]
UE4Editor_CoreUObject!CollectGarbage() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\coreuobject\private\uobject\garbagecollection.cpp:1400]
UE4Editor_UnrealEd!UEditorEngine::EndPlayMap() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\editor\unrealed\private\playlevel.cpp:327]
UE4Editor_UnrealEd!UEditorEngine::Tick() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\editor\unrealed\private\editorengine.cpp:1579]
UE4Editor_UnrealEd!UUnrealEdEngine::Tick() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\editor\unrealed\private\unrealedengine.cpp:366]
UE4Editor!FEngineLoop::Tick() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\launch\private\launchengineloop.cpp:2428]
UE4Editor!GuardedMain() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\launch\private\launch.cpp:142]
UE4Editor!GuardedMainWrapper() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\launch\private\windows\launchwindows.cpp:126]
UE4Editor!WinMain() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.9\engine\source\runtime\launch\private\windows\launchwindows.cpp:200]