using System; using System.Collections; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; namespace Michsky.UI.Heat { public class SwitchManager : MonoBehaviour, IPointerClickHandler, IEventSystemHandler, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler, ISubmitHandler { [Serializable] public class SwitchEvent : UnityEvent { } [SerializeField] private Animator switchAnimator; [SerializeField] private CanvasGroup highlightCG; public bool saveValue; public string saveKey = "My Switch"; public bool isOn = true; public bool isInteractable = true; public bool invokeOnEnable = true; public bool useSounds = true; public bool useUINavigation; [Range(1f, 15f)] public float fadingMultiplier = 8f; [SerializeField] public SwitchEvent onValueChanged = new SwitchEvent(); public UnityEvent onEvents = new UnityEvent(); public UnityEvent offEvents = new UnityEvent(); private bool isInitialized; private void Awake() { if (saveValue) { GetSavedData(); } else { if (base.gameObject.activeInHierarchy) { StopCoroutine("DisableAnimator"); StartCoroutine("DisableAnimator"); } switchAnimator.enabled = true; if (isOn) { switchAnimator.Play("On Instant"); } else { switchAnimator.Play("Off Instant"); } } if (base.gameObject.GetComponent() == null) { Image image = base.gameObject.AddComponent(); image.color = new Color(0f, 0f, 0f, 0f); image.raycastTarget = true; } if (useUINavigation) { AddUINavigation(); } if (highlightCG == null) { highlightCG = new GameObject().AddComponent(); highlightCG.transform.SetParent(base.transform); highlightCG.gameObject.name = "Highlighted"; } if (invokeOnEnable && isOn) { onEvents.Invoke(); onValueChanged.Invoke(isOn); } else if (invokeOnEnable && !isOn) { offEvents.Invoke(); onValueChanged.Invoke(isOn); } isInitialized = true; } private void OnEnable() { if (UIManagerAudio.instance == null) { useSounds = false; } if (isInitialized) { UpdateUI(); } } private void GetSavedData() { if (base.gameObject.activeInHierarchy) { StopCoroutine("DisableAnimator"); StartCoroutine("DisableAnimator"); } switchAnimator.enabled = true; if (PlayerPrefs.GetString("Switch_" + saveKey) == "" || !PlayerPrefs.HasKey("Switch_" + saveKey)) { if (isOn) { switchAnimator.Play("Off"); PlayerPrefs.SetString("Switch_" + saveKey, "true"); } else { switchAnimator.Play("Off"); PlayerPrefs.SetString("Switch_" + saveKey, "false"); } } else if (PlayerPrefs.GetString("Switch_" + saveKey) == "true") { switchAnimator.Play("Off"); isOn = true; } else if (PlayerPrefs.GetString("Switch_" + saveKey) == "false") { switchAnimator.Play("Off"); isOn = false; } } public void AddUINavigation() { Button button = base.gameObject.AddComponent