Advertisement
Guest User

PointCloud

a guest
May 3rd, 2014
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.56 KB | None | 0 0
  1. using System;
  2. using UnityEngine;
  3.  
  4. namespace Assets.Scripts.Client
  5. {
  6.     /// <summary>
  7.     /// PointCloud is a class that gives programatic control of a ParticleEmitter
  8.     /// so we can create a mathematic simulation.
  9.     /// </summary>
  10.     [ExecuteInEditMode]
  11.     public class PointCloud : MonoBehaviour
  12.     {
  13.         public Action<ParticleEmitter> onParticleEmitterChangedDelegate;
  14.  
  15.         [SerializeField][HideInInspector]
  16.         private GameObject m_ParticleEmitterInstance = null;
  17.  
  18.         [SerializeField][HideInInspector]
  19.         private float[] m_CachedAngularVelocity = new float[0];
  20.         [SerializeField][HideInInspector]
  21.         private Color[] m_CachedColor = new Color[0];
  22.         [SerializeField][HideInInspector]
  23.         private float[] m_CachedEnergy = new float[0];
  24.         [SerializeField][HideInInspector]
  25.         private Vector3[] m_CachedPosition = new Vector3[0];
  26.         [SerializeField][HideInInspector]
  27.         private float[] m_CachedRotation = new float[0];
  28.         [SerializeField][HideInInspector]
  29.         private float[] m_CachedSize = new float[0];
  30.         [SerializeField][HideInInspector]
  31.         private float[] m_CachedStartEnergy = new float[0];
  32.         [SerializeField][HideInInspector]
  33.         private Vector3[] m_CachedVelocity = new Vector3[0];
  34.  
  35.         #region Properties
  36.  
  37.         private ParticleEmitter m_CachedParticleEmitter = null;
  38.         /// <summary>
  39.         /// Gets the particle emitter.
  40.         ///
  41.         /// We return the particle emitter that belongs to the instantiated
  42.         /// particles GameObject.
  43.         /// </summary>
  44.         /// <value>The particle system.</value>
  45.         public new ParticleEmitter particleEmitter
  46.         {
  47.             get
  48.             {
  49.                 if (this.m_CachedParticleEmitter == null && this.m_ParticleEmitterInstance != null)
  50.                     this.m_CachedParticleEmitter =
  51.                         this.m_ParticleEmitterInstance.GetComponent<ParticleEmitter>() as ParticleEmitter;
  52.                 return this.m_CachedParticleEmitter;
  53.             }
  54.         }
  55.  
  56.         [SerializeField][HideInInspector]
  57.         private GameObject m_ParticleEmitterPrefab = null;
  58.         /// <summary>
  59.         /// Sets the particle emitter prefab.
  60.         /// </summary>
  61.         /// <value>The particle emitter prefab.</value>
  62.         public GameObject particleEmitterPrefab
  63.         {
  64.             get
  65.             {
  66.                 return this.m_ParticleEmitterPrefab;
  67.             }
  68.             set
  69.             {
  70.                 this.SetParticleEmitterPrefab(value);
  71.             }
  72.         }
  73.  
  74.         /// <summary>
  75.         /// Gets or sets the particles.
  76.         /// </summary>
  77.         /// <value>The particles.</value>
  78.         public Particle[] particles
  79.         {
  80.             get
  81.             {
  82.                 return this.GetParticles();
  83.             }
  84.             set
  85.             {
  86.                 this.SetParticles(value);
  87.             }
  88.         }
  89.  
  90.         #endregion
  91.  
  92.         #region Unity Methods
  93.        
  94.         /// <summary>
  95.         /// Called when the object is instantiated
  96.         /// </summary>
  97.         protected virtual void Awake()
  98.         {
  99.             this._RebuildParticlesFromCache();
  100.         }
  101.  
  102.         /// <summary>
  103.         /// Called when the object is about to be destroyed
  104.         /// </summary>
  105.         protected virtual void OnDestroy()
  106.         {
  107.             this._Clear();
  108.         }
  109.  
  110.         #endregion
  111.  
  112.         #region Methods
  113.  
  114.         /// <summary>
  115.         /// Sets the particle emitter prefab.
  116.         /// </summary>
  117.         /// <param name="prefab">Prefab.</param>
  118.         public void SetParticleEmitterPrefab(GameObject prefab)
  119.         {
  120.             if (prefab == this.m_ParticleEmitterPrefab)
  121.                 return;
  122.  
  123.             this.m_ParticleEmitterPrefab = prefab;
  124.  
  125.             if (this.m_ParticleEmitterPrefab != null)
  126.             {
  127.                 ParticleEmitter prefabEmitter = this.m_ParticleEmitterPrefab.GetComponent<ParticleEmitter>();
  128.                 if (prefabEmitter == null)
  129.                     Debug.LogWarning("Particle Emitter Prefab has no ParticleEmitter component");
  130.             }
  131.  
  132.             this._InstantiateParticlePrefab();
  133.         }
  134.  
  135.         /// <summary>
  136.         /// Gets the particles.
  137.         /// </summary>
  138.         /// <returns>The particles.</returns>
  139.         public Particle[] GetParticles()
  140.         {
  141.             if (this.particleEmitter == null)
  142.                 return this._GetParticlesFromCache();
  143.  
  144.             return this.particleEmitter.particles.Clone() as Particle[];
  145.         }
  146.  
  147.         /// <summary>
  148.         /// Gets the particle world position.
  149.         /// </summary>
  150.         /// <returns>The particle world position.</returns>
  151.         public Vector3 GetParticleWorldPosition(Particle particle)
  152.         {
  153.             Vector3 position = particle.position;
  154.  
  155.             // Particle doesn't really exist in space
  156.             if (this.particleEmitter == null)
  157.             {
  158.                 Debug.LogWarning("Unknown particle simulation space");
  159.                 return position;
  160.             }
  161.  
  162.             // We need to translate the particle from local space
  163.             if (!this.particleEmitter.useWorldSpace)
  164.                 return this.particleEmitter.transform.TransformPoint(position);
  165.  
  166.             return position;
  167.         }
  168.  
  169.         /// <summary>
  170.         /// Sets the particles.
  171.         /// </summary>
  172.         /// <param name="particles">Particles.</param>
  173.         public void SetParticles(Particle[] particles)
  174.         {
  175.             if (this.particleEmitter != null)
  176.                 this.particleEmitter.particles = particles;
  177.  
  178.             this._SetParticlesToCache(particles);
  179.         }
  180.  
  181.         /// <summary>
  182.         /// Builds the particles.
  183.         /// </summary>
  184.         /// <returns>The particles.</returns>
  185.         /// <param name="count">Count.</param>
  186.         public static Particle[] BuildParticles(int count)
  187.         {
  188.             Particle[] particles = new Particle[count];
  189.  
  190.             // If the energy of the particles is zero or less, the particles
  191.             // will be deleted as soon as they are assigned to the particle emitter
  192.             for (int index=0; index < count; index++)
  193.                 particles[index].energy = 1.0f;
  194.  
  195.             return particles;
  196.         }
  197.  
  198.         #endregion
  199.  
  200.         #region Private Methods
  201.  
  202.         /// <summary>
  203.         /// Particles aren't serialized by unity so we need to separate them into
  204.         /// their properties
  205.         /// </summary>
  206.         /// <param name="particles">Particles.</param>
  207.         private void _SetParticlesToCache(Particle[] particles)
  208.         {
  209.             int count = particles.Length;
  210.  
  211.             this.m_CachedAngularVelocity = new float[count];
  212.             this.m_CachedColor = new Color[count];
  213.             this.m_CachedEnergy = new float[count];
  214.             this.m_CachedPosition = new Vector3[count];
  215.             this.m_CachedRotation = new float[count];
  216.             this.m_CachedSize = new float[count];
  217.             this.m_CachedStartEnergy = new float[count];
  218.             this.m_CachedVelocity = new Vector3[count];
  219.  
  220.             for (int index=0; index < particles.Length; index++)
  221.             {
  222.                 this.m_CachedAngularVelocity[index] = particles[index].angularVelocity;
  223.                 this.m_CachedColor[index] = particles[index].color;
  224.                 this.m_CachedEnergy[index] = particles[index].energy;
  225.                 this.m_CachedPosition[index] = particles[index].position;
  226.                 this.m_CachedRotation[index] = particles[index].rotation;
  227.                 this.m_CachedSize[index] = particles[index].size;
  228.                 this.m_CachedStartEnergy[index] = particles[index].startEnergy;
  229.                 this.m_CachedVelocity[index] = particles[index].velocity;
  230.             }
  231.         }
  232.  
  233.         /// <summary>
  234.         /// Rebuilds the array of particles from the cache
  235.         /// </summary>
  236.         /// <returns>The particles from cache.</returns>
  237.         private Particle[] _GetParticlesFromCache()
  238.         {
  239.             int count = this.m_CachedAngularVelocity.Length;
  240.             Particle[] output = new Particle[count];
  241.  
  242.             for (int index=0; index < count; index++)
  243.             {
  244.                 Particle particle = new Particle();
  245.  
  246.                 particle.angularVelocity = this.m_CachedAngularVelocity[index];
  247.                 particle.color = this.m_CachedColor[index];
  248.                 particle.energy = this.m_CachedEnergy[index];
  249.                 particle.position = this.m_CachedPosition[index];
  250.                 particle.rotation = this.m_CachedRotation[index];
  251.                 particle.size = this.m_CachedSize[index];
  252.                 particle.startEnergy = this.m_CachedStartEnergy[index];
  253.                 particle.velocity = this.m_CachedVelocity[index];
  254.  
  255.                 output[index] = particle;
  256.             }
  257.  
  258.             return output;
  259.         }
  260.  
  261.         /// <summary>
  262.         /// Instantiates the particle prefab.
  263.         /// </summary>
  264.         private void _InstantiateParticlePrefab()
  265.         {
  266.             this._Clear();
  267.  
  268.             this.m_CachedParticleEmitter = null;
  269.  
  270.             if (this.m_ParticleEmitterPrefab != null)
  271.             {
  272.                 this.m_ParticleEmitterInstance = Instantiate(this.m_ParticleEmitterPrefab) as GameObject;
  273.  
  274.                 this.m_ParticleEmitterInstance.transform.parent = this.transform;
  275.                 this.m_ParticleEmitterInstance.transform.localPosition = Vector3.zero;
  276.                 this.m_ParticleEmitterInstance.transform.localEulerAngles = Vector3.zero;
  277.                 this.m_ParticleEmitterInstance.transform.localScale = Vector3.one;
  278.  
  279.                 this.m_ParticleEmitterInstance.layer = this.gameObject.layer;
  280.  
  281.                 this._RebuildParticlesFromCache();
  282.             }
  283.  
  284.             if (this.onParticleEmitterChangedDelegate != null)
  285.                 this.onParticleEmitterChangedDelegate(this.particleEmitter);
  286.         }
  287.  
  288.         /// <summary>
  289.         /// Reapplies the cached particles
  290.         /// </summary>
  291.         private void _RebuildParticlesFromCache()
  292.         {
  293.             this.SetParticles(this._GetParticlesFromCache());
  294.         }
  295.  
  296.         /// <summary>
  297.         /// Tidy up generated GameObjects
  298.         /// </summary>
  299.         private void _Clear()
  300.         {
  301.             if (Application.isEditor)
  302.                 DestroyImmediate(this.m_ParticleEmitterInstance);
  303.             else
  304.                 Destroy(this.m_ParticleEmitterInstance);
  305.         }
  306.  
  307.         #endregion
  308.     }
  309. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement