Files
2025-06-04 16:44:53 +09:30

146 lines
3.7 KiB
C#

public class LockEmissive : MonoBehaviour
{
[Header("Behavior")] public bool pulse = true;
public bool breakpoint;
public bool success;
public bool off;
[Header("Settings")][Range(0f, 5f)] public float pulseSpeedMod = 0.5f;
[Header("Colors")] public Color hightlightColor = Color.yellow;
public Color[] colors = { Color.cyan, Color.red, Color.yellow, Color.green, Color.blue, Color.magenta, Color.white, Color.grey, Color.yellow, Color.blue };
[Header("Renderers")][SerializeField] private Renderer[] _renderers;
public Renderer highlightRenderer;
// Hidden from Inspector
[HideInInspector] public float breakpointValue;
[HideInInspector] public float successValue;
private int _colorIndex;
// Private variables
private float _pulseValue;
private void Start()
{
}
private void Update()
{
if (off)
{
SetAllMaterials(0f);
}
else if (pulse)
{
_pulseValue = Mathf.PingPong(Time.time * pulseSpeedMod, 1); // Pulse the value over time
SetAllMaterials(_pulseValue); // Set the values
}
else if (breakpoint)
{
SetAllMaterials(breakpointValue); // Set the values
}
else if (success)
{
SetAllMaterials(Mathf.Clamp(Mathf.Abs(successValue - 1), 0, 1)); // Set the values
}
if (highlightRenderer)
SetHighlightMaterial();
}
private Color _activeColor()
{
return colors[_colorIndex];
}
public void SetRenders(Renderer[] newRenders)
{
_renderers = newRenders;
}
public void SetHighlightRenderer(Renderer value)
{
highlightRenderer = value;
}
private void SetHighlightMaterial()
{
// sphereii: disable the high light color
//highlightRenderer.material.SetColor("_EmissionColor", hightlightColor);
highlightRenderer.material.SetColor("_EmissionColor", Color.clear);
}
/// <summary>
/// Sets all materials attached to the renderers array
/// </summary>
/// <param name="value"></param>
private void SetAllMaterials(float value)
{
if (_renderers == null) return;
for (var i = 0; i < _renderers.Length; i++)
if (_renderers[i] != null && _renderers[i].gameObject != null)
if (_renderers[i].gameObject.activeSelf)
SetMaterial(_renderers[i].material, value);
}
/// <summary>
/// Sets a single material
/// </summary>
/// <param name="material"></param>
/// <param name="value"></param>
private void SetMaterial(Material material, float value)
{
var finalColor = _activeColor() * Mathf.LinearToGammaSpace(value);
//material.SetColor("_EmissionColor", finalColor);
// sphereii: give it a nice bronze color
material.SetColor("_EmissionColor", new Color(0.666f, 0.588f, 0.275f, 1f));
}
public void NextColor()
{
_colorIndex = _colorIndex + 1 >= colors.Length ? 0 : _colorIndex + 1;
}
public void PrevColor()
{
_colorIndex = _colorIndex - 1 < 0 ? colors.Length - 1 : _colorIndex - 1;
}
public void SetPulse()
{
pulse = true;
breakpoint = false;
success = false;
off = false;
}
public void SetBreakpoint()
{
pulse = false;
breakpoint = true;
success = false;
off = false;
}
public void SetSuccess()
{
pulse = false;
breakpoint = false;
success = true;
off = false;
}
public void SetOff()
{
pulse = false;
breakpoint = false;
success = false;
off = true;
}
}