Skip to content
Snippets Groups Projects
LightFlicker.cs 2.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • David Huss's avatar
    David Huss committed
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    
    [RequireComponent(typeof(Light))]
    public class LightFlicker : MonoBehaviour
    {
        [Tooltip("Base Brightness of the flickering light (used when Normality happens)")]
        [Range(0.0f, 8.0f)]
        public float baseBrightness = 1.0f;
    
        [Tooltip("Intensity of the periodic brightness fluctuations")]
        [Range(0.0f, 10.0f)]
        public float oscillationIntensity = 2.0f;
        [Tooltip("Frequency of the periodic brightness fluctuations")]
        [Range(0.0f, 100.0f)]
        public float oscillationSpeed = 44.0f;
    
        [Tooltip("Intensity of the random brightness flicker")]
        [Range(0.0f, 10.0f)]
        public float flickerIntensity = 2.0f;
        [Tooltip("Frequency of the random brightness flicker")]
        [Range(0.0f, 1.0f)]
        public float flickerSpeed = 0.1f;
        [Tooltip("Off vs On-percentage of the random brightness flicker")]
        [Range(0.0f, 1.0f)]
        public float flickerOffVsOn = 0.5f;
    
        [Tooltip("Frequency of the normality effect (where flicker and oscillations are switched off)")]
        [Range(0.0f, 1.0f)]
        public float normalitySpeed = 0.1f;
        [Tooltip("Likelyhood of the normality effect to happen (where flicker and oscillations are switched off)")]
        [Range(0.0f, 1.0f)]
        public float normalityLikelyhood = 0.5f;
    
        float randomWalk = 0.0f;
        float flickerBrightness = 0.0f;
        float upperBound = 1.0f;
        float lowerBound = -1.0f;
    
        float oscillationBrightness = 0.0f;
    
        float randomWalk2 = 0.0f;
        float upperBound2 = 1.0f;
        float lowerBound2 = 0.0f;
    
        Light thisLight;
        // Start is called before the first frame update
        void Start()
        {
            thisLight = this.gameObject.GetComponent<Light>();
        }
    
        // Update is called once per frame
        void Update()
        {
            // Flicker
            randomWalk += Random.Range(-flickerSpeed, flickerSpeed);
            if (randomWalk >= upperBound) { randomWalk = upperBound; }
            if (randomWalk <= lowerBound) { randomWalk = lowerBound; }
            flickerBrightness = (randomWalk * flickerIntensity) + (-8.0f + flickerOffVsOn * 16.0f) * flickerIntensity;
    
            // Oscillation
            oscillationBrightness =  ((Mathf.PingPong(Time.time*oscillationSpeed, 8.0f) * Mathf.PingPong(Time.time*oscillationSpeed*1.131517f,4.0f)) - 4.0f) * oscillationIntensity*0.1f;
    
            // Normality
            randomWalk2 += Random.Range(-normalitySpeed * 0.2f, normalitySpeed * 0.2f);
            if (randomWalk2 >= upperBound2) { randomWalk2 = upperBound2; }
            if (randomWalk2 <= lowerBound2) { randomWalk2 = lowerBound2; }
    
            if (randomWalk2 <= normalityLikelyhood) 
            {
                thisLight.intensity = baseBrightness;
            } else {
                thisLight.intensity = baseBrightness + flickerBrightness + oscillationBrightness;
            }
        }
    }