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); } } }