少年修仙传客户端代码仓库
client_linchunjie
2018-09-19 88439d08aa3d51d882f0043835dfc8b9e90261c0
Core/SFX/SFXController.cs
@@ -1,201 +1,201 @@
using TableConfig;
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].gameObject.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].gameObject.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;
                }
            }
        }
        if (m_CacheParticleSystem != null)
        {
            ParticleSystem.MainModule _mainModule;
            for (int i = 0; i < m_CacheParticleSystem.Length; ++i)
            {
                _mainModule = m_CacheParticleSystem[i].main;
                _mainModule.simulationSpeed = m_ParticleProperties[i].simulationSpeed * speed;
            }
        }
    }
    private void SetChildActive(Transform transforms, bool active)
    {
        for (int i = 0; i < transforms.childCount; ++i)
        {
            transforms.GetChild(i).gameObject.SetActive(active);
            if (transforms.GetChild(i).childCount > 0)
            {
                SetChildActive(transforms.GetChild(i), active);
            }
        }
    }
}
using TableConfig;
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].gameObject.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].gameObject.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;
                }
            }
        }
        if (m_CacheParticleSystem != null)
        {
            ParticleSystem.MainModule _mainModule;
            for (int i = 0; i < m_CacheParticleSystem.Length; ++i)
            {
                _mainModule = m_CacheParticleSystem[i].main;
                _mainModule.simulationSpeed = m_ParticleProperties[i].simulationSpeed * speed;
            }
        }
    }
    private void SetChildActive(Transform transforms, bool active)
    {
        for (int i = 0; i < transforms.childCount; ++i)
        {
            transforms.GetChild(i).gameObject.SetActive(active);
            if (transforms.GetChild(i).childCount > 0)
            {
                SetChildActive(transforms.GetChild(i), active);
            }
        }
    }
}