| 
using UnityEngine; 
 | 
using UnityEngine.Events; 
 | 
  
 | 
public class SFXController : MonoBehaviour 
 | 
{ 
 | 
    public struct ParticleProperties 
 | 
    { 
 | 
        public float simulationSpeed; 
 | 
    } 
 | 
  
 | 
    public float duration = 2; 
 | 
    [System.NonSerialized] 
 | 
    public UnityAction<SFXController> m_OnFinished; 
 | 
  
 | 
    [HideInInspector] 
 | 
    public int effectId; 
 | 
  
 | 
    [HideInInspector] 
 | 
    public float startTime; 
 | 
  
 | 
    public int DelayFrameCount 
 | 
    { 
 | 
        get; set; 
 | 
    } 
 | 
  
 | 
    [HideInInspector] 
 | 
    public EffectConfig config; 
 | 
  
 | 
    public bool releaseHideChildren = true; 
 | 
  
 | 
    private float m_AnimatorSpeed = 1; 
 | 
    private ParticleSystem[] m_CacheParticleSystem; 
 | 
    private ParticleProperties[] m_ParticleProperties; 
 | 
    private TrailRenderer[] m_CacheTrailRenderer; 
 | 
    private Animator[] m_CacheAnimator; 
 | 
    private Renderer[] m_Renderers; 
 | 
  
 | 
    private bool m_Active; 
 | 
  
 | 
    private void Awake() 
 | 
    { 
 | 
        if (m_CacheParticleSystem == null) 
 | 
        { 
 | 
            m_CacheParticleSystem = gameObject.GetComponentsInChildren<ParticleSystem>(true); 
 | 
            if (m_CacheParticleSystem != null) 
 | 
            { 
 | 
                m_ParticleProperties = new ParticleProperties[m_CacheParticleSystem.Length]; 
 | 
                for (int i = 0; i < m_CacheParticleSystem.Length; ++i) 
 | 
                { 
 | 
                    m_ParticleProperties[i] = new ParticleProperties() 
 | 
                    { 
 | 
                        simulationSpeed = m_CacheParticleSystem[i].main.simulationSpeed 
 | 
                    }; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        if (m_CacheTrailRenderer == null) 
 | 
        { 
 | 
            m_CacheTrailRenderer = gameObject.GetComponentsInChildren<TrailRenderer>(true); 
 | 
        } 
 | 
  
 | 
        if (m_CacheAnimator == null) 
 | 
        { 
 | 
            m_CacheAnimator = gameObject.GetComponentsInChildren<Animator>(true); 
 | 
        } 
 | 
  
 | 
        if (m_Renderers == null) 
 | 
        { 
 | 
            m_Renderers = gameObject.GetComponentsInChildren<Renderer>(true); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    void Update() 
 | 
    { 
 | 
        if (m_AnimatorSpeed == 0) 
 | 
        { 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        startTime += Time.deltaTime; 
 | 
  
 | 
        if (duration > 0 
 | 
         && startTime >= duration) 
 | 
        { 
 | 
            m_AnimatorSpeed = 1; 
 | 
            SFXPlayUtility.Instance.Release(this); 
 | 
  
 | 
            if (m_OnFinished != null) 
 | 
            { 
 | 
                m_OnFinished(this); 
 | 
                m_OnFinished = null; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void SetActive(bool active) 
 | 
    { 
 | 
        m_Active = active; 
 | 
  
 | 
        if (m_CacheParticleSystem != null && m_CacheParticleSystem.Length > 0) 
 | 
        { 
 | 
            for (int i = 0; i < m_CacheParticleSystem.Length; ++i) 
 | 
            { 
 | 
                if (active) 
 | 
                { 
 | 
                    m_CacheParticleSystem[i].Play(); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    m_CacheParticleSystem[i].Stop(); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        if (m_CacheAnimator != null && m_CacheAnimator.Length > 0) 
 | 
        { 
 | 
            for (int i = 0; i < m_CacheAnimator.Length; ++i) 
 | 
            { 
 | 
                if (active) 
 | 
                { 
 | 
                    m_CacheAnimator[i].enabled = true; 
 | 
                    if (m_CacheAnimator[i].runtimeAnimatorController) 
 | 
                    { 
 | 
                        m_CacheAnimator[i].Play(m_CacheAnimator[i].GetCurrentAnimatorStateInfo(0).shortNameHash, 0, 0); 
 | 
                        m_CacheAnimator[i].Update(0); 
 | 
                    } 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    m_CacheAnimator[i].enabled = false; 
 | 
                } 
 | 
            } 
 | 
  
 | 
            //if (!active && releaseHideChildren) 
 | 
            //{ 
 | 
            //    if (m_Renderers != null && m_Renderers.Length > 0) 
 | 
            //    { 
 | 
            //        for (int i = 0; i < m_Renderers.Length; ++i) 
 | 
            //        { 
 | 
            //            if (m_Renderers[i].gameObject.activeSelf) 
 | 
            //            { 
 | 
            //                m_Renderers[i].SetActive(active); 
 | 
            //            } 
 | 
            //        } 
 | 
            //    } 
 | 
  
 | 
            //    if (m_CacheParticleSystem != null && m_CacheParticleSystem.Length > 0) 
 | 
            //    { 
 | 
            //        for (int i = 0; i < m_CacheParticleSystem.Length; ++i) 
 | 
            //        { 
 | 
            //            if (m_CacheParticleSystem[i].gameObject.activeSelf) 
 | 
            //            { 
 | 
            //                m_CacheParticleSystem[i].SetActive(active); 
 | 
            //            } 
 | 
            //        } 
 | 
            //    } 
 | 
            //} 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void SetAnimatorSpeed(float speed) 
 | 
    { 
 | 
        m_AnimatorSpeed = speed; 
 | 
        if (m_CacheAnimator != null) 
 | 
        { 
 | 
            for (int i = 0; i < m_CacheAnimator.Length; ++i) 
 | 
            { 
 | 
                var animator = m_CacheAnimator[i]; 
 | 
                if (animator != null) 
 | 
                { 
 | 
                    m_CacheAnimator[i].speed = m_AnimatorSpeed; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void SetPaticleSystemSpeed(float speed) 
 | 
    { 
 | 
        if (m_CacheParticleSystem != null) 
 | 
        { 
 | 
            ParticleSystem.MainModule _mainModule; 
 | 
            for (int i = 0; i < m_CacheParticleSystem.Length; ++i) 
 | 
            { 
 | 
                if (m_CacheParticleSystem[i]) 
 | 
                { 
 | 
                    _mainModule = m_CacheParticleSystem[i].main; 
 | 
                    _mainModule.simulationSpeed = m_ParticleProperties[i].simulationSpeed * speed; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void SetParticleEmissionRateOverTime(float value) 
 | 
    { 
 | 
        if (m_CacheParticleSystem != null) 
 | 
        { 
 | 
            ParticleSystem.EmissionModule _emissioinModule; 
 | 
            for (int i = 0; i < m_CacheParticleSystem.Length; ++i) 
 | 
            { 
 | 
                if (m_CacheParticleSystem[i]) 
 | 
                { 
 | 
                    _emissioinModule = m_CacheParticleSystem[i].emission; 
 | 
                    _emissioinModule.rateOverTime = value; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void SetChildActive(Transform transforms, bool active) 
 | 
    { 
 | 
        for (int i = 0; i < transforms.childCount; ++i) 
 | 
        { 
 | 
            transforms.GetChild(i).SetActive(active); 
 | 
  
 | 
            if (transforms.GetChild(i).childCount > 0) 
 | 
            { 
 | 
                SetChildActive(transforms.GetChild(i), active); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |