如需转载本文,请声明作者及出处。
UParticleModuleEventSendToGame can send the events of particle emit to the game, but no used example can be found in the source code or document。
To use it, you need to do the following:
1.send events https://github.com/EpicGames/UnrealEngine/pull/1522/commits
2.Implement your derived class
UCLASS()
class UParticleEventXXXX : public UParticleModuleEventSendToGame
{
GENERATED_UCLASS_BODY()
//
Member variables
virtual void DoEvent(...);
};
void UParticleEventXXXX::DoEvent(...) {
// any thing
}
3.You can see your derived classes here
4.Select your derived class, you can see the member variables
It is derived from Uobject, all these member variables can be serialized and displayed in the UI widget.
5.preview
Now, it only works at runtime.It's not friendly to art colleagues。You need to provide preview function in the editor。
void UParticleSystemComponent::FinalizeTickComponent()
{
AParticleEventManager* EventManager = (World ? World->MyParticleEventManager : NULL);
if (EventManager)
{
if (SpawnEvents.Num() > 0)
EventManager->HandleParticleSpawnEvents(this, SpawnEvents);
if (DeathEvents.Num() > 0)
EventManager->HandleParticleDeathEvents(this, DeathEvents);
if (CollisionEvents.Num() > 0)
EventManager->HandleParticleCollisionEvents(this, CollisionEvents);
if (BurstEvents.Num() > 0)
EventManager->HandleParticleBurstEvents(this, BurstEvents);
}
}
In edit mode, eventmanager is Null
Just like:
void UParticleSystemComponent::FinalizeTickComponent()
{
...
UWorld* World = GetWorld();
AParticleEventManager* EventManager = (World ? World->MyParticleEventManager : NULL);
#ifdef WITH_EDITOR
if (EventManager == NULL && !GEngine->ParticleEventManagerClassPath.IsEmpty())
{
setting World->MyParticleEventManager
EventManager = World->MyParticleEventManager;
}
#endif
if (EventManager)
{
if (SpawnEvents.Num() > 0)
EventManager->HandleParticleSpawnEvents(this, SpawnEvents);
if (DeathEvents.Num() > 0)
EventManager->HandleParticleDeathEvents(this, DeathEvents);
if (CollisionEvents.Num() > 0)
EventManager->HandleParticleCollisionEvents(this, CollisionEvents);
if (BurstEvents.Num() > 0)
EventManager->HandleParticleBurstEvents(this, BurstEvents);
}
....
}