shuriken particle system not rendering particles when off screen

When the particle system moves out of the current camera’s view the particles stop rendering. This causes all of the current particles to disappear. It even occurs when in scene view. Any thoughts on how I could fix this?

I have had exactly this problem. In my case it was occurring even if none of the game objects related to the particle system were scaled.

I did however find a workaround. If you enable “Sub Emitters” on the particle system, it will work correctly when offscreen. So I’m pretty certain this is a bug in Unity as that is not what I would have expected to fix the issue.

Hope this helps others stuck with the same problem.

It appears that this happens when the transform a particle system is attached to is scaled.

In my case, my rocket was scaled (for example, 0.2 in every dimension), and the particle emitter was attached to a child object with a scale of 1 (but an inherited scale of 0.2 as well). When I changed the child’s scale to 5 offset the parent’s, the particles no longer disappear when the emitter is off-screen.

I’m still not sure exactly why this happens. It seems like a bug, since it’s not particularly useful behavior (nor is it documented). Still, try making sure your transform has no scale, or make a child game object with a corrective scale and control your particle size with MaxParticleSize and other Shuriken properties.

The best way to fix this is to untick Resimulate, ensure you tick Simulate in World space, and ensure the transform of the particle system is in front of the camera (replace it after emitting from a given position)

Old question, however I had the same symptoms, but in my situation fix was needed somewhere else.
I am adding particles manually (since i have positions from other particle system), so in my code i forgot to specify axisOfRotation. That’s why shuriken renderer does not know how to behave when camera moves within different angles… So i needed to specify:

particle.axisOfRotation = new Vector3(0, 1, 0);

For me the problem is that when you are using “Stretched Billboard” and set "start speed’ to , also enabled “Velocity over Lifetime”, the bug appears. So whatever you do , don’t leave the start speed to 0. That should solve the problem.

hope this would help.

PS. I think shuriken programmers couldn’t do anything unless they can reproduce the bug… so here you go, fix it please.

I fixed this in my project by enabling wireframe, scaling the particle emitter. The initial emitter was too small, but when I touched the scale gizmo it expanded to the correct size and the issue of disappearing particles resolved itself.

Non-uniform scaling set for ParticleSystem transform seems disabling culling. So I just set scale to 1.01, 1, 1 and it did work for me.

I had this issue too with particle trails on my bullets in a Galiga-style 2D shmup for school. My solution was to make a check when the bullet exited the screen and clamp it’s movement to the camera’s screen borders. Then I’d disable the collider and renderer so it would appear as if it had left the screen, even though it would continue to exist just long enough for the particles to finish their lifetime. The key method I used is the Camera.WorldToScreenPoint() (and its counterpart, ScreenToWorldPoint()) found at Unity - Scripting API: Camera.WorldToScreenPoint . You may also find the OnBecameInvisible/OnBecameVisible methods useful for this kind of edge of screen stuff too, found at Unity - Scripting API: MonoBehaviour.OnBecameInvisible() and Unity - Scripting API: MonoBehaviour.OnBecameVisible() respectively.

Using the WorldToScreenPoint() method you could do something like the following in your script if you want to clamp your object to the screen to make sure its particles render:

//This is in C#. I don't know enough javascript to know if this will work 
//for it or not.

Vector3 ScreenPosition = MyCamera.WorldToScreenPoint(transform.position);

if (ScreenPosition.x >= Screen.width)
{
     ScreenPosition.x = Screen.width;
}
else if (ScreenPosition.x <= 0)
{
     ScreenPosition.x = 0;
}

if (ScreenPosition.y >= Screen.height)
{
     ScreenPosition.y = Screen.height;
}
else if (ScreenPosition.y <= 0)
{
     ScreenPosition.y = 0;
} 

gameObject.transform.position = CameraObject.ScreenToWorldPoint(ScreenPosition);

Note that this makes the object half off, half on screen since this goes by the transform’s center point. To make it keep it entirely on/off you’d need to figure out the screen position difference based on the size of the gameObject’s rendering which I’m not really sure how to do. Hopefully someone else can elaborate on doing that and even more on doing this as a whole since I’m definitely not as experienced as many of the users here.