| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 | using System;using UnityEngine;namespace HQFPSWeapons{    [RequireComponent(typeof(Light))]    public class LightEffect : MonoBehaviour    {        #region Internal        public enum PlayMode { Once, Loop }        [Serializable]        public class PulseSettings        {            public bool Enabled;            public PlayMode Mode;            [Space]            [Range(0f, 3f)]            public float Duration;            public Color Color;            [Space]            [Range(0f, 1f)]            public float IntensityAmplitude;            [Range(0f, 1f)]            public float RangeAmplitude;            [Range(0f, 1f)]            public float ColorWeight;        }        [Serializable]        public class NoiseSettings        {            public bool Enabled;            [Range(0f, 1f)]            public float Intensity = 0.05f;            [Range(0f, 10f)]            public float Speed = 1f;        }        #endregion        public bool IsPlaying { get => m_IsPlaying; }        public float IntensityMultiplier { get; set; }        [SerializeField]        private bool m_PlayOnAwake = false;        [SerializeField]        [Range(0f, 5f)]        private float m_Intensity = 1f;        [SerializeField]        [Range(0f, 10f)]        private float m_Range = 1f;        [SerializeField]        private Color m_Color = Color.yellow;        [Space]        [SerializeField]        [Range(0f, 2f)]        private float m_FadeInTime = 0.5f;        [SerializeField]        [Range(0f, 2f)]        private float m_FadeOutTime = 0.5f;        [Header("Effects")]        [SerializeField]        private PulseSettings m_Pulse = null;        [SerializeField]        private NoiseSettings m_Noise = null;        private bool m_IsPlaying;        private bool m_LightsEnabled;        private float m_Weight;        private bool m_FadingIn;        private bool m_FadingOut;        private Light[] m_Lights;        private bool m_PulseActive;        private float m_PulseTimer;        public void Play(bool fadeIn)        {            if(m_IsPlaying)                return;            m_IsPlaying = true;            m_PulseActive = true;            m_FadingIn = fadeIn;            m_Weight = m_FadingIn ? 0f : 1f;            m_PulseTimer = 0f;        }        public void Stop(bool fadeOut)        {            m_IsPlaying = false;            m_FadingOut = fadeOut;            m_PulseActive = false;            if(!m_FadingOut)                m_Weight = 0f;        }        private void Awake()        {            m_Lights = GetComponentsInChildren<Light>(true);            EnableLights(false);            IntensityMultiplier = 1f;            if (m_PlayOnAwake)                Play(true);        }        private void Update()        {            float intensity = m_Intensity;            float range = m_Range;            Color color = m_Color;            if(m_IsPlaying)            {                // Pulse handling                if (m_Pulse.Enabled && m_PulseActive)                {                    float time = m_PulseTimer / Mathf.Max(m_Pulse.Duration, 0.001f);                    float param = (Mathf.Sin(Mathf.PI * (2f * time - 0.5f)) + 1f) * 0.5f;                    intensity += m_Intensity * param * m_Pulse.IntensityAmplitude;                    range += m_Range * param * m_Pulse.RangeAmplitude;                    color = Color.Lerp(color, m_Pulse.Color, param * m_Pulse.ColorWeight);                    m_PulseTimer += Time.deltaTime;                    if(m_PulseTimer > m_Pulse.Duration)                    {                        if(m_Pulse.Mode == PlayMode.Once)                            m_PulseActive = false;                        m_PulseTimer = 0f;                    }                }                // Auto stop when all effects finished playing                if(!m_PulseActive)                {                    m_IsPlaying = false;                    m_FadingOut = true;                }            }            // Noise            if(m_LightsEnabled && m_Noise.Enabled)            {                float noise = Mathf.PerlinNoise(Time.time * m_Noise.Speed, 0f) * m_Noise.Intensity;                intensity += m_Intensity * noise;                range += m_Range * noise;            }            // Fade in & out            if(m_FadingIn)            {                m_Weight = Mathf.MoveTowards(m_Weight, 1f, Time.deltaTime * (1f / m_FadeInTime));                if(m_Weight == 1f)                    m_FadingIn = false;            }            else if(m_FadingOut)            {                m_Weight = Mathf.MoveTowards(m_Weight, 0f, Time.deltaTime * (1f / m_FadeOutTime));                if(m_Weight == 0f)                {                    EnableLights(false);                    SetLightsIntensity(0f);                    m_FadingOut = false;                }            }            // Enable the light if effects started playing            if(!m_LightsEnabled && m_IsPlaying)                EnableLights(true);            // Apply effects to the light            if(m_LightsEnabled)                SetLightsParameters(intensity * IntensityMultiplier * m_Weight, range, color);        }        private void EnableLights(bool enable)        {            for(int i = 0;i < m_Lights.Length;i++)                m_Lights[i].enabled = enable;            m_LightsEnabled = enable;        }        private void SetLightsIntensity(float intensity)        {            for(int i = 0;i < m_Lights.Length;i++)                m_Lights[i].intensity = intensity;        }        private void SetLightsParameters(float intensity, float range, Color color)        {            for(int i = 0;i < m_Lights.Length;i++)            {                m_Lights[i].intensity = intensity;                m_Lights[i].range = range;                m_Lights[i].color = color;            }        }    }}
 |