using DG.Tweening; using UnityEngine; public class PushableButton : MonoBehaviour { public delegate void OnButtonPressedDelegate(); public event OnButtonPressedDelegate OnButtonPressed; public bool startDown; public Transform movableParts; public float moveDuration = 0.25f; public Transform wire; public Material wireActiveMaterial; public Material wireInactiveMaterial; private float upPositionY; private float downPositionY; private bool isButtonDown; private void Awake() { upPositionY = movableParts.localPosition.y; downPositionY = movableParts.localPosition.y - 0.1f; isButtonDown = false; } // Start is called before the first frame update void Start() { if (startDown) { // Dont call Activate, we dont want to change wire material here movableParts.DOLocalMoveY(downPositionY, moveDuration); isButtonDown = true; } } // Update is called once per frame void Update() { } private void OnCollisionEnter(Collision collision) { if (!isButtonDown && collision.gameObject.tag.EndsWith("Hand")) { Activate(); OnButtonPressed?.Invoke(); } } private void Activate() { movableParts.DOLocalMoveY(downPositionY, moveDuration); isButtonDown = true; foreach (MeshRenderer meshRenderer in wire.GetComponentsInChildren()) { meshRenderer.material = wireActiveMaterial; } } public void Deactivate() { movableParts.DOLocalMoveY(upPositionY, moveDuration); isButtonDown = false; foreach (MeshRenderer meshRenderer in wire.GetComponentsInChildren()) { meshRenderer.material = wireInactiveMaterial; } } }