How do you set Particles to known positions?

I would like to be able to draw point clouds using particles. To do this I need to be able to set an array of particles to a known position, zero velocity, emit them and have them last forever. However, I cannot the setting of the position to work.

My set up is as follows.

  • Empty GameObject with a
    ParticleSystem attached
  • Duration = 1
  • Looping = true
  • Start Lifetime = 10
  • Start Speed = 0
  • Start Size = 0.1
  • Emission is turned off
  • Shape is turned off
  • Renderer is turned on.

The following script is attached to the GameObject

using UnityEngine;
using System.Collections;

public class PointCloud : MonoBehaviour {

	ParticleSystem.Particle[] cloud;

	void Start ()
	{	
		float v = 1.0f;
		cloud = new ParticleSystem.Particle[4];
		cloud[0].position = new Vector3(v,v,v);
		cloud[1].position = new Vector3(-v,v,-v);    
		cloud[2].position = new Vector3(-v,v,v);
		cloud[3].position = new Vector3(v,v,-v);
		
		for(int ii = 0; ii < cloud.Length; ++ii)
		{
			ParticleSystem.Particle p = cloud[ii];
			p.color = Color.red;
			p.velocity = Vector3.zero;
			p.angularVelocity = 0.0f;
 			p.rotation = 0.0f;
			p.size = 0.1f;
			p.lifetime = 1.0f;
			p.randomValue = 0.0f;
		}
		
		particleSystem.SetParticles(cloud, cloud.Length);
		particleSystem.Emit(cloud.Length);
	}
}
  • All that happens though is I get an single (or more, I can’t tell) particle at the system’s origin.
  • The particle has the size and color set in the inspector and not that in the script.
  • If I add a Shape then I do get 4 points, but at random locations and not the locations specified.
  • Also, if I get the particles after setting them, they do have the positions and other characteristics I specified.
  • I am using Unity 3.5.2f2

These posts indicate that it is possible:

Finally got it working. Here is a minimal example with no error checking:

using UnityEngine;
using System.Collections;

public class PointCloud : MonoBehaviour
{
	ParticleSystem.Particle[] cloud;
	bool bPointsUpdated = false;
	
	void Start ()
	{
	}
	
	void Update () 
	{
		if (bPointsUpdated)
		{
			particleSystem.SetParticles(cloud, cloud.Length);
			bPointsUpdated = false;
		}
	}
	
	public void SetPoints(Vector3[] positions, Color[] colors)
	{		
		cloud = new ParticleSystem.Particle[positions.Length];
		
		for (int ii = 0; ii < positions.Length; ++ii)
		{
			cloud[ii].position = positions[ii];			
			cloud[ii].color = colors[ii];
			cloud[ii].size = 0.1f;			
		}

		bPointsUpdated = true;
	}
}

Attach this script to a GameObject with a Shuriken particle system, and set the particle system as follows to make it inert:

  • Looping false
  • Play On Awake false
  • Max Particlesto the max number of particles you want
  • Turn off everything except Renderer

In the Renderer:

  • Sort Mode By Distance
  • Cast Shadows false
  • Receive Shadows false

This tutorial was very enlightening and awesome: Graphs - visualizing data

I’ve never tried to do that with the shuriken system, but from the lightning bolt example you should

  • Emit 4 particles.
  • Store them into an array with GetParticles.
  • Apply the modifications.
  • Use SetParticles to assign them back.

For those stumbling across this in Unity 2018.x, check out my answer here with a functional example.
http://answers.unity.com/answers/1573665/view.html
Thank you to all the answers here, you helped me find a solution!

I am trying the same thing. Although I can call SetParticles() without error, I do not see my particles and GetParticles() returns nothing, even on a “stock” ParticleSystem that is visibly emitting particles.

Do GetParticles() and SetParticles() work (using Javascript and UnityPro 3.5.3)?

function emitTex () {

var mult : float = 0.5;
var x : int;
var y : int;
var c : Color;
var p : ParticleSystem.Particle;
p = new ParticleSystem.Particle[4096];
var i : int = 0;
for (x = 0 ; x < map.width ; x = x + 1 ) {
for (y = 0 ; y < map.height ; y = y + 1 ) {
c = map.GetPixel(x,y);
p_.position = Vector3(x * mult, y * mult, 0 );_
p*.color = c;*
p*.size = 4.0;*
Debug.Log(i+" “+p_.size.ToString()+” “+p*.position.ToString()+” c="+c.ToString());
i = i + 1;
}
}
ps.Play();
particleSystem.SetParticles(p,p.Length);
Debug.Log("made “+i+” particles
");

//ps.Play();
var pp : ParticleSystem.Particle[];
var n : int;
n = particleSystem.GetParticles(pp);
Debug.Log("got “+n+” particles
");

flag = 0;
}*_