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; } } }