You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.1 KiB
C#
64 lines
2.1 KiB
C#
3 weeks ago
|
using UnityEngine;
|
||
|
|
||
|
namespace Unity.BossRoom.VisualEffects
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// This script randomly varies a light source to create a flickering effect.
|
||
|
/// </summary>
|
||
|
public class RandomizedLight : MonoBehaviour
|
||
|
{
|
||
|
private const int k_IntensityScale = 100;
|
||
|
|
||
|
[Tooltip("External light to vary. Leave null if this script is itself attached to a Light")]
|
||
|
public Light m_TargetLight;
|
||
|
|
||
|
[Tooltip("Minimum light intensity to randomize to")]
|
||
|
public float m_MinIntensity = 0f;
|
||
|
|
||
|
[Tooltip("Maximum light intensity to randomize to")]
|
||
|
public float m_MaxIntensity = 1f;
|
||
|
|
||
|
[Tooltip("How much smoothing to apply to the signal. Lower values will be less smoothed.")]
|
||
|
[Range(1, 50)]
|
||
|
public int m_Smoothing = 5;
|
||
|
|
||
|
private int[] m_RingBuffer; //a buffer full of noise ranging from min to max.
|
||
|
private int m_RingSum; //the sum of all the values in the current ring buffer.
|
||
|
private int m_RingIndex; //the current index of the buffer.
|
||
|
|
||
|
// Start is called before the first frame update
|
||
|
void Start()
|
||
|
{
|
||
|
m_RingBuffer = new int[m_Smoothing];
|
||
|
for (int i = 0; i < m_RingBuffer.Length; ++i)
|
||
|
{
|
||
|
UpdateNoiseBuffer();
|
||
|
}
|
||
|
|
||
|
if (m_TargetLight == null)
|
||
|
{
|
||
|
m_TargetLight = GetComponent<Light>();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void UpdateNoiseBuffer()
|
||
|
{
|
||
|
int newValue = (int)(Random.Range(m_MinIntensity, m_MaxIntensity) * k_IntensityScale);
|
||
|
m_RingSum += (newValue - m_RingBuffer[m_RingIndex]);
|
||
|
m_RingBuffer[m_RingIndex] = newValue;
|
||
|
|
||
|
m_RingIndex = (m_RingIndex + 1) % m_RingBuffer.Length;
|
||
|
}
|
||
|
|
||
|
// Update is called once per frame
|
||
|
void Update()
|
||
|
{
|
||
|
//should be a value between 0-1
|
||
|
float lightIntensity = m_RingSum / (float)(m_RingBuffer.Length * k_IntensityScale);
|
||
|
m_TargetLight.intensity = lightIntensity;
|
||
|
|
||
|
UpdateNoiseBuffer();
|
||
|
}
|
||
|
}
|
||
|
}
|