You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/Epic Toon FX/Demo/Scripts/ETFXEffectControllerPooled.cs

177 lines
4.7 KiB
C#

3 months ago
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace EpicToonFX
{
public class ETFXEffectControllerPooled : MonoBehaviour
{
public GameObject[] effects;
private List<GameObject> 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<Text>();
effectIndexText = GameObject.Find("EffectIndex").GetComponent<Text>();
etfxMouseOrbit = Camera.main.GetComponent<ETFXMouseOrbit>();
etfxMouseOrbit.etfxEffectControllerPooled = this;
//Pooling
effectsPool = new List<GameObject>();
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<Light>())
{
currentEffect.GetComponent<Light>().enabled = false;
}
if (disableSound && currentEffect.GetComponent<AudioSource>())
{
currentEffect.GetComponent<AudioSource>().enabled = false;
}
//Update UI
effectNameText.text = effects[effectIndex].name;
effectIndexText.text = (effectIndex + 1) + " of " + effects.Length;
ParticleSystem particleSystem = currentEffect.GetComponent<ParticleSystem>();
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();
}
}
}
}
}