using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace EpicToonFX { public class ETFXEffectControllerPooled : MonoBehaviour { public GameObject[] effects; private List effectsPool; private int effectIndex = 0; [Space(10)] [Header("Spawn Settings")] public bool disableLights = true; public bool disableSound = true; public float startDelay = 0.2f; public float respawnDelay = 0.5f; public bool slideshowMode = false; public bool autoRotation = false; [Range(0.001f, 0.5f)] public float autoRotationSpeed = 0.1f; private GameObject currentEffect; private Text effectNameText; private Text effectIndexText; private ETFXMouseOrbit etfxMouseOrbit; //Caching components private void Awake() { effectNameText = GameObject.Find("EffectName").GetComponent(); effectIndexText = GameObject.Find("EffectIndex").GetComponent(); etfxMouseOrbit = Camera.main.GetComponent(); etfxMouseOrbit.etfxEffectControllerPooled = this; //Pooling effectsPool = new List(); for (int i = 0; i < effects.Length; i++) { GameObject effect = Instantiate(effects[i], transform.position, Quaternion.identity); effect.transform.parent = transform; effectsPool.Add(effect); effect.SetActive(false); } } private void Start() { Invoke("InitializeLoop", startDelay); } private void Update() { if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) { NextEffect(); } if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) { PreviousEffect(); } } private void FixedUpdate() { if (autoRotation) { etfxMouseOrbit.SetAutoRotationSpeed(autoRotationSpeed); if (!etfxMouseOrbit.isAutoRotating) etfxMouseOrbit.InitializeAutoRotation(); } } public void InitializeLoop() { StartCoroutine(EffectLoop()); } public void NextEffect() { if (effectIndex < effects.Length - 1) { effectIndex++; } else { effectIndex = 0; } CleanCurrentEffect(); } public void PreviousEffect() { if (effectIndex > 0) { effectIndex--; } else { effectIndex = effects.Length - 1; } CleanCurrentEffect(); } private void CleanCurrentEffect() { StopAllCoroutines(); if (currentEffect != null) { currentEffect.SetActive(false); } StartCoroutine(EffectLoop()); } private IEnumerator EffectLoop() { //Pooling effect currentEffect = effectsPool[effectIndex]; currentEffect.SetActive(true); if (disableLights && currentEffect.GetComponent()) { currentEffect.GetComponent().enabled = false; } if (disableSound && currentEffect.GetComponent()) { currentEffect.GetComponent().enabled = false; } //Update UI effectNameText.text = effects[effectIndex].name; effectIndexText.text = (effectIndex + 1) + " of " + effects.Length; ParticleSystem particleSystem = currentEffect.GetComponent(); while (true) { yield return new WaitForSeconds(particleSystem.main.duration + respawnDelay); if (!slideshowMode) { if (!particleSystem.main.loop) { currentEffect.SetActive(false); currentEffect.SetActive(true); } } else { //Double delay for looping effects if (particleSystem.main.loop) { yield return new WaitForSeconds(respawnDelay); } NextEffect(); } } } } }