This setup involves two emitters using two different blueprints: The first one spawns the photon torpedoes while it’s child produces the sparkle trails.
The emitter for the torpedoes is at the middle of the room but the particles start from the Enterprise (using a named emitter parameter), as defined by the second module in the [Position] stack, a Transform sampler. The Vector module above it serves as a fallback position, should the transform sampling fail for any reason (for example the referenced game object doesn’t exist anymore).
After a particle is born it should start moving in the direction of the Borg cube, so let’s take a look at the [Velocity] stack. The first two modules produce the position difference of the two spaceships while the third one makes it a unit vector so their distance doesn’t matter. The final module is just for fine tuning speed.
So with that the torpedoes are fired toward the Borg but they should react to hitting it or colliding with the walls of the room. Not having real collisions I had to use a workaround: volume samplers. They are in the [Death condition] stack and they produce 1 when inside the Borg cube or outside the room’s volume. (Again, those game objects are referenced through named emitter parameters.)
The [Death duration] stack defines a 0.5 seconds time frame during which the particles change their size and color (vertex color controls different shader features in this case). On death the particles are also stopped by a Motion tweaker module, similar to the previous example.
Now let’s see the child emitter, creating the sparks behind the torpedoes. In the [Spawn Rate] stack the parent’s particle count is sampled every 0.2 seconds and multiplied by a constant in the next node. This way the number of sparks is directly controlled by the parent emitter, there is no need to sync the two blueprints in any other way: this child blueprint could be used with any other parent, it will adapt automatically.
The only other interesting mechanic is in the [Position] stack: The first node puts the sparks inside the Borg cube, simply hides them in case the next module fails at sampling the position of a particle from the parent. If the spark does find a living torpedo particle then it is placed at it’s location at the time of sampling. (Plus some random deviation from the last module.)
(Note that currently there is a bug here: if a spark was successfully positioned at the wake of a torpedo but that torpedo dies before the spark does then the spark jumps back to its fallback position, into the Borg cube, instead of keeping its totally valid sample value.)