/// <summary>
    /// Play the specified _particleGameObject in _positio. And set if autoCache it
    /// </summary>

    public void Play(GameObject _particleGameObject, Vector3 _position, bool _autoCache)
    {
        ParticleCacheData particleSystemToUse = ConfigureParticleSystemForPlay(_particleGameObject, _position, _autoCache);

        if (particleSystemToUse != null)
        {
            StartCoroutine(DelayedParticlePlay(particleSystemToUse.cachedParticleSystem[0]));
        }

//		else
//			Debug.LogError(string.Format("You are trying to emit from {0} without having caching it before" + _particleGameObject.name));
    }
    /// <summary>
    /// Configures the particle system for play.
    /// </summary>

    private ParticleCacheData ConfigureParticleSystemForPlay(GameObject _particleGameObject, Vector3 _position, bool _autoCache)
    {
        if (_autoCache)
        {
            CacheParticleSystem(_particleGameObject);
        }

        ParticleCacheData particleSystemToUse = particleObjectReferences[_particleGameObject];

        if (particleSystemToUse != null)
        {
            particleSystemToUse.cachedTransform.position = _position;
            particleSystemToUse.instantiatedGameObject.SetActive(true);
            return(particleSystemToUse);
        }
        return(null);
    }
    /// <summary>
    /// Play the specified _particleGameObject in _positio. And set if autoCache it
    /// </summary>
    public void Emit(GameObject _particleGameObject, Vector3 _position, bool _autoCache)
    {
        ParticleCacheData particleSystemToUse = ConfigureParticleSystemForPlay(_particleGameObject, _position, _autoCache);

        if (particleSystemToUse.burstQuantity.Length != particleSystemToUse.cachedParticleSystem.Length)         //Protection to use Emit in a not ready prefab
        {
            Play(_particleGameObject, _position, _autoCache);
        }


        if (particleSystemToUse != null)
        {
            for (int i = 0; i < particleSystemToUse.cachedParticleSystem.Length; i++)
            {
                particleSystemToUse.cachedParticleSystem[i].Emit(particleSystemToUse.burstQuantity[i].burstQuantity);
            }
        }
//		else
//			Debug.LogError(string.Format("You are trying to emit from {0} without having caching it before" + _particleGameObject.name));
    }
	/// <summary>
	/// Caches the particle system.
	/// </summary>
	public GameObject CacheParticleSystem(GameObject _particleGameObject, bool alreadyInstantiated = false)
	{
		//Check if its already on the dictionary
		if (!particleObjectReferences.ContainsKey(_particleGameObject))
		{
			GameObject tempInstantiatedParticleObject;
			if ( !alreadyInstantiated ) {
				tempInstantiatedParticleObject = Instantiate(_particleGameObject) as GameObject;
			} else {
				tempInstantiatedParticleObject = _particleGameObject;
			}
			
			ParticleCacheData tempParticleCacheData = new ParticleCacheData(tempInstantiatedParticleObject);
			particleObjectReferences.Add(_particleGameObject,  tempParticleCacheData);
			tempInstantiatedParticleObject.SetActive(false); //Disabled until you need it
			
			return tempInstantiatedParticleObject;
		}
		
		return null;
	}
    /// <summary>
    /// Caches the particle system.
    /// </summary>
    public GameObject CacheParticleSystem(GameObject _particleGameObject, bool alreadyInstantiated = false)
    {
        //Check if its already on the dictionary
        if (!particleObjectReferences.ContainsKey(_particleGameObject))
        {
            GameObject tempInstantiatedParticleObject;
            if (!alreadyInstantiated)
            {
                tempInstantiatedParticleObject = Instantiate(_particleGameObject) as GameObject;
            }
            else
            {
                tempInstantiatedParticleObject = _particleGameObject;
            }

            ParticleCacheData tempParticleCacheData = new ParticleCacheData(tempInstantiatedParticleObject);
            particleObjectReferences.Add(_particleGameObject, tempParticleCacheData);
            tempInstantiatedParticleObject.SetActive(false);             //Disabled until you need it

            return(tempInstantiatedParticleObject);
        }

        return(null);
    }