Here is a screenshot of a simplified particle system. I can access the emitter, but cannot access the “Size By Life” parameter I have highlighted. When I search for the module or any similar property, I come up empty-handed.
Is there any way to access / modify a specific module parameter setting from within C++?
Specifically, I have a particle system, and in it, there are several particle emitters. Under one such emitter (which has a special name), it has several modules. I would like to change either the InitialSize or really the Size By Life module settings. I can already find the UParticleEmitter from within code, but cannot seem to find any way to access the modules within it.
When I try to access any Modules from the UParticleEmitter, I get empty TMaps, empty TArrays, etc. Nothing.
Here is my sample code: [NOTE: UParticleSystem* OverlapParticles;]
TArray<UParticleEmitter*> UPEs = OverlapParticles->Emitters;
if (UPEs.Num() > 0)
{
for (UParticleEmitter* em : UPEs)
{
UE_LOG(LogTemp, Warning, TEXT("ParticleEmitter Name: %s"), *(em->EmitterName).ToString());
}
UParticleEmitter* UPEptr = nullptr; // = UPEs.FindByKey("SpecialEmitterName");
int32 blastIndex = UPEs.FindLastByPredicate([](UParticleEmitter* em) { return ((em->EmitterName == FName("SpecialEmitterName")) ? em : nullptr); });
UE_LOG(LogTemp, Warning, TEXT("blastIndex = %d"), blastIndex);
if (blastIndex >= 0) UPEptr = UPEs[blastIndex];
if (UPEptr)
{
UE_LOG(LogTemp, Warning, TEXT("Particle Emitter Found!"));
TArray<UParticleModule*> ModulesNeedingInstanceData = UPEptr->ModulesNeedingInstanceData;
TArray<UParticleModule*> ModulesNeedingRandomSeed = UPEptr->ModulesNeedingRandomSeedInstanceData;
UE_LOG(LogTemp, Warning, TEXT("Modules Needing Instance Data:"));
for (UParticleModule* mod : ModulesNeedingInstanceData)
{
UE_LOG(LogTemp, Warning, TEXT("Module Name: %s"), *(mod->GetFName()).ToString());
}
UE_LOG(LogTemp, Warning, TEXT("Modules Needing Random Seed:"));
for (UParticleModule* mod : ModulesNeedingRandomSeed)
{
UE_LOG(LogTemp, Warning, TEXT("Module Name: %s"), *(mod->GetFName()).ToString());
}
TMap < UParticleModule*, uint32 > ModuleOffsetMap = UPEptr->ModuleOffsetMap;
UE_LOG(LogTemp, Warning, TEXT("Number of Module Offset Map Elements: %d"), ModuleOffsetMap.Num());
for (auto& Elem : ModuleOffsetMap)
{
UE_LOG(LogTemp, Warning, TEXT("ModuleOffsetMap: Value: %d , Key Name: %s"), Elem.Value, *((Elem.Key)->GetFName()).ToString());
}
TMap < UParticleModule*, uint32 > ModuleInstanceOffsetMap = UPEptr->ModuleInstanceOffsetMap;
UE_LOG(LogTemp, Warning, TEXT("Number of Module Instance Offset Map Elements: %d"), ModuleInstanceOffsetMap.Num());
for (auto& Elem : ModuleInstanceOffsetMap)
{
UE_LOG(LogTemp, Warning, TEXT("ModuleOffsetMap: Value: %d , Key Name: %s"), Elem.Value, *((Elem.Key)->GetFName()).ToString());
}
}
else
{
UE_LOG(LogTemp, Warning, TEXT("Could not find SpecialEmitterName"));
}
}