playMaker

Author Topic: ArrayListGetParticles  (Read 1654 times)

cwmanley

  • Full Member
  • ***
  • Posts: 107
ArrayListGetParticles
« on: January 22, 2016, 03:17:04 AM »
Gets the positions of particles in a particle system and stores them in a array.

On the Ecosystem or https://snipt.net/cwmanley/

//Updated

Name changed from ArrayListGetPaticlesVector3 which was dumb it should have been ArrayListGetPaticlesPosition, anyway it is just ArrayListGetParticles now.

Gets the Position, Rotation, Size, Velocity, Color, or Lifetime of Particles in a Particle System and stores them in a Array.

Code: [Select]
// License: Attribution 4.0 International (CC BY 4.0)
/*--- __ECO__ __PLAYMAKER__ __ACTION__ ---*/
// Keywords: Particle Array Arraymaker List

using UnityEngine;
using System.Collections;

namespace HutongGames.PlayMaker.Actions
{
[ActionCategory("ArrayMaker/ArrayList")]
[Tooltip("Gets the Position, Rotation, Size, Velocity, Color, or Lifetime of Particles in a Particle System and stores them in a Array.")]
public class ArrayListGetParticles : ArrayListActions
{

[ActionSection("Set up")]

[RequiredField]
[Tooltip("The gameObject with the PlayMaker ArrayList Proxy component")]
[CheckForComponent(typeof(PlayMakerArrayListProxy))]
public FsmOwnerDefault gameObject;

[Tooltip("Author defined Reference of the PlayMaker ArrayList Proxy component ( necessary if several component coexists on the same GameObject")]
public FsmString reference;

public bool everyFrame;

[ActionSection("Source")]

[RequiredField]
[Tooltip("the GameObject to get the particles from.")]
[CheckForComponent(typeof(ParticleSystem))]
public FsmGameObject particleSystem;

[Tooltip("The Particle System's Parameters.")]
public Parameters parameters;

public enum Parameters

{
Position,
Rotation,
Size,
Velocity,
Color,
Lifetime
}

private ParticleSystem.Particle[] particlesArray;
        private ParticleSystem _ps;
private Vector3[] particles;
private int numParticlesAlive;
private Color[] particlesColor;
private float[] particlesFloat;

public override void Reset()
{
parameters = Parameters.Position;
everyFrame = false;
}

public override void OnEnter()
{
_ps = particleSystem.Value.GetComponent<ParticleSystem>();

if ( SetUpArrayListProxyPointer(Fsm.GetOwnerDefaultTarget(gameObject),reference.Value) )
ArrayList();

if (!everyFrame)
Finish();
}

public override void OnUpdate()
{
if ( SetUpArrayListProxyPointer(Fsm.GetOwnerDefaultTarget(gameObject),reference.Value) )
ArrayList();
}

public void ArrayList()
{
if (!isProxyValid ())
return;
{
switch (parameters)
{
case Parameters.Position:

InitializeIfNeeded();

numParticlesAlive = _ps.GetParticles(particlesArray);
particles = new Vector3[numParticlesAlive];

for (int i = 0; i < numParticlesAlive; i++)
{
proxy.arrayList.Clear();
particles[i] = particlesArray[i].position;
proxy.arrayList.InsertRange(0,particles);
}
break;

case Parameters.Rotation:

InitializeIfNeeded();

numParticlesAlive = _ps.GetParticles(particlesArray);
particlesFloat = new float[numParticlesAlive];

for (int i = 0; i < numParticlesAlive; i++)
{
proxy.arrayList.Clear();
particlesFloat[i] = particlesArray[i].rotation;
proxy.arrayList.InsertRange(0,particlesFloat);
}
break;

case Parameters.Size:

InitializeIfNeeded();

numParticlesAlive = _ps.GetParticles(particlesArray);
particlesFloat = new float[numParticlesAlive];

for (int i = 0; i < numParticlesAlive; i++)
{
proxy.arrayList.Clear();
particlesFloat[i] = particlesArray[i].startSize;
proxy.arrayList.InsertRange(0,particlesFloat);
}
break;

case Parameters.Velocity:

InitializeIfNeeded();

numParticlesAlive = _ps.GetParticles(particlesArray);
particles = new Vector3[numParticlesAlive];

for (int i = 0; i < numParticlesAlive; i++)
{
proxy.arrayList.Clear();
particles[i] = particlesArray[i].velocity;
proxy.arrayList.InsertRange(0,particles);
}
break;

case Parameters.Color:

InitializeIfNeeded();

numParticlesAlive = _ps.GetParticles(particlesArray);
particlesColor = new Color[numParticlesAlive];

for (int i = 0; i < numParticlesAlive; i++)
{
proxy.arrayList.Clear();
particlesColor[i] = particlesArray[i].startColor;
proxy.arrayList.InsertRange(0,particlesColor);
}
break;

case Parameters.Lifetime:

InitializeIfNeeded();

numParticlesAlive = _ps.GetParticles(particlesArray);
particlesFloat = new float[numParticlesAlive];

for (int i = 0; i < numParticlesAlive; i++)
{
proxy.arrayList.Clear();
particlesFloat[i] = particlesArray[i].lifetime;
proxy.arrayList.InsertRange(0,particlesFloat);
}
break;
}
InitializeIfNeeded();
}
}

public void InitializeIfNeeded()
{
if (particlesArray == null || particlesArray.Length < _ps.maxParticles)
particlesArray = new ParticleSystem.Particle[_ps.maxParticles];
        }
}
}
« Last Edit: February 15, 2017, 02:25:55 PM by cwmanley »