Esempio n. 1
0
        IEnumerator PlayEffectTimeline(EffectType effect, Vector3 position, Quaternion orientation = default(Quaternion), Transform parent = null, EffectInstancePool pool = null)
        {
            if (effect.audioGroupType == EffectAudioGroupType.Footstep)
            {
                FootStepZone zone = FootStepZone.GetZone(position);
                if (zone != null)
                {
                    effect = zone.footstepEffect;
                    if (zone.overridePositionY)
                    {
                        position.y = zone.transform.position.y;
                    }
                }
            }

            var  frame          = new WaitForEndOfFrame();
            bool instanceFired  = effect.prefab == null;
            bool soundFired     = effect.sound == null;
            bool subEffectFired = effect.subEffect == null;

            if (effect.screenShake && screenShakeCamera != null)
            {
                screenShakeCamera.AddShake(effect.screenShakeCurve);
            }

            GameObject effectInstance = null;

            for (float t = 0; t <= 1; t += Time.deltaTime / effect.lifeSpan)
            {
                if (!instanceFired && t > effect.prefabQueue)
                {
                    instanceFired = true;
                    if (pool == null)
                    {
                        if (logsOn)
                        {
                            Debug.Log("instantiating effect");
                        }
                        effectInstance = Instantiate(effect.prefab, position, orientation) as GameObject;
                        effectInstance.transform.parent = (!effect.allowInstanceAttachToParent || parent == null) ? transform : parent;
                        if (effect.disableLoopingParticles)
                        {
                            var particles = effectInstance.GetComponentsInChildren <ParticleSystem> ();
                            for (int i = 0; i < particles.Length; i++)
                            {
                                particles[i].loop = false;
                            }
                        }
                    }
                    else
                    {
                        effectInstance = pool.FireNext(position, orientation, parent);
                    }
                }
                if (!soundFired && t >= effect.soundQueue)
                {
                    if (logsOn)
                    {
                        Debug.Log("playing sound");
                    }
                    soundFired = true;
                    AudioSource audioSource = effectAudioSourceGroups[(int)effect.audioGroupType].TakeNext();
                    audioSource.transform.position = position;
                    if (effect.allowAudioSourceAttachToParent && parent != null)
                    {
                        audioSource.transform.parent = parent;
                    }
                    else
                    {
                        audioSource.transform.parent = transform;
                    }
                    effect.PlayClipThroughAudioSource(audioSource);
                }
                if (!subEffectFired && t > effect.subEffectQueue)
                {
                    subEffectFired = true;
                    PlayEffect(effect.subEffect, position, orientation, parent);
                }

                yield return(frame);
            }

            if (effectInstance != null)
            {
                if (pool == null)
                {
                    Destroy(effectInstance);
                }
                else
                {
                    effectInstance.SetActive(false);
                }
            }
        }