Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

set emissive material's intensity to flicker along with a flickering light script in c#

Discussion in 'Scripting' started by KjellVDZ, Jun 13, 2019.

  1. KjellVDZ

    KjellVDZ

    Joined:
    Jun 11, 2019
    Posts:
    1
    This is my first game i'm making in unity. I used a flicked light script i found online and it works fine om my lamp. I've been looking for a way to make my emissive material wich i used for the lamp shade, flicker along with it. This is the script.


    using UnityEngine;
    using System.Collections.Generic;
    // Written by Steve Streeting 2017
    // License: CC0 Public Domain http://creativecommons.org/publicdomain/zero/1.0/
    /// <summary>
    /// Component which will flicker a linked light while active by changing its
    /// intensity between the min and max values given. The flickering can be
    /// sharp or smoothed depending on the value of the smoothing parameter.
    ///
    /// Just activate / deactivate this component as usual to pause / resume flicker
    /// </summary>
    public class Flicker : MonoBehaviour
    {
    [Tooltip("External light to flicker; you can leave this null if you attach script to a light")]
    public new Light light;
    [Tooltip("Minimum random light intensity")]
    public float minIntensity = 0f;
    [Tooltip("Maximum random light intensity")]
    public float maxIntensity = 1f;
    [Tooltip("How much to smooth out the randomness; lower values = sparks, higher = lantern")]
    [Range(1, 50)]
    public int smoothing = 5;
    // Continuous average calculation via FIFO queue
    // Saves us iterating every time we update, we just change by the delta
    Queue<float> smoothQueue;
    float lastSum = 0;
    /// <summary>
    /// Reset the randomness and start again. You usually don't need to call
    /// this, deactivating/reactivating is usually fine but if you want a strict
    /// restart you can do.
    /// </summary>
    public void Reset()
    {
    smoothQueue.Clear();
    lastSum = 0;
    }
    void Start()
    {
    smoothQueue = new Queue<float>(smoothing);
    // External or internal light?
    if (light == null)
    {
    light = GetComponent<Light>();
    }
    }
    void Update()
    {
    if (light == null)
    return;
    // pop off an item if too big
    while (smoothQueue.Count >= smoothing)
    {
    lastSum -= smoothQueue.Dequeue();
    }
    // Generate random new item, calculate new average
    float newVal = Random.Range(minIntensity, maxIntensity);
    smoothQueue.Enqueue(newVal);
    lastSum += newVal;
    // Calculate new smoothed average
    light.intensity = lastSum / (float)smoothQueue.Count;
    }
    }
     
  2. SparrowGS

    SparrowGS

    Joined:
    Apr 6, 2017
    Posts:
    2,536