Files
HeadlessHazard/Assets/Code/Scripts/Interaction/TestBlock.cs

149 lines
3.4 KiB
C#

using UnityEngine;
using UnityEngine.Events;
public class TestBlock : MonoBehaviour
{
[Header("Visual")]
[SerializeField] private Renderer targetRenderer;
[SerializeField] private Color offColor = Color.red;
[SerializeField] private Color onColor = Color.green;
[Header("Material")]
[SerializeField] private string colorPropertyName = "_BaseColor";
[Header("Optional Auto Wiring")]
[Tooltip("If assigned, block turns ON while plate is pressed and OFF when released.")]
[SerializeField] private PressurePlateButton[] pressurePlates;
[Tooltip("If assigned, block toggles every time the wall button is interacted with.")]
[SerializeField] private WallInteractButton[] wallButtons;
private MaterialPropertyBlock m_propertyBlock;
private bool m_isOn;
private void Awake()
{
if (targetRenderer == null)
{
targetRenderer = GetComponentInChildren<Renderer>();
}
m_propertyBlock = new MaterialPropertyBlock();
}
private void Start()
{
SetOff();
}
private void OnEnable()
{
RegisterEvents();
}
private void OnDisable()
{
UnregisterEvents();
}
public void SetOn()
{
m_isOn = true;
Debug.Log($"{gameObject.name} turned ON");
ApplyColor(onColor);
}
public void SetOff()
{
m_isOn = false;
Debug.Log($"{gameObject.name} turned OFF");
ApplyColor(offColor);
}
public void Toggle()
{
if (m_isOn)
SetOff();
else
SetOn();
}
// Generic interaction entry point for UnityEvents from any interactable.
public void TriggerInteraction()
{
Toggle();
}
public void Activate()
{
SetOn();
}
public void Deactivate()
{
SetOff();
}
private void ApplyColor(Color color)
{
if (targetRenderer == null)
return;
targetRenderer.GetPropertyBlock(m_propertyBlock);
m_propertyBlock.SetColor(colorPropertyName, color);
targetRenderer.SetPropertyBlock(m_propertyBlock);
}
private void RegisterEvents()
{
if (pressurePlates != null)
{
for (int i = 0; i < pressurePlates.Length; i++)
{
if (pressurePlates[i] == null)
continue;
pressurePlates[i].OnPressed.AddListener(SetOn);
pressurePlates[i].OnReleased.AddListener(SetOff);
}
}
if (wallButtons != null)
{
for (int i = 0; i < wallButtons.Length; i++)
{
if (wallButtons[i] == null)
continue;
wallButtons[i].OnInteract.AddListener(Toggle);
}
}
}
private void UnregisterEvents()
{
if (pressurePlates != null)
{
for (int i = 0; i < pressurePlates.Length; i++)
{
if (pressurePlates[i] == null)
continue;
pressurePlates[i].OnPressed.RemoveListener(SetOn);
pressurePlates[i].OnReleased.RemoveListener(SetOff);
}
}
if (wallButtons != null)
{
for (int i = 0; i < wallButtons.Length; i++)
{
if (wallButtons[i] == null)
continue;
wallButtons[i].OnInteract.RemoveListener(Toggle);
}
}
}
}