using System; using System.Collections; using System.Collections.Generic; using System.Linq.Expressions; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.UI; namespace Beyond { public class SkipButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { [SerializeField] private Image m_skipImage; [SerializeField] private TextMeshProUGUI m_description; [SerializeField] private TextMeshProUGUI m_Paused; [SerializeField] private AnimationCurve m_showCurve; [SerializeField] private bool m_onlySkip = true; private SkipCanvas m_skipCanvas; private bool m_isPaused = false; public float m_skipTime = 2f; public float m_quickTapTime = 0.1f; public float m_showTime = 3f; private float m_showTimer; private bool m_isTouching = false; private float m_timer = 0f; private int m_tapCounter = 0; // Nowe eventy public UnityEvent OnStartSkip; public UnityEvent OnEndSkip; void Awake() { m_skipCanvas = gameObject.FindComponentUpHierarchy(); } private void OnEnable() { m_timer = 0f; m_tapCounter = 0; m_isTouching = false; m_isPaused = false; m_Paused.gameObject.SetActive(false); m_skipImage.gameObject.SetActive(false); m_description.gameObject.SetActive(false); } private void Pause() { m_isPaused = !m_isPaused; m_Paused.gameObject.SetActive(m_isPaused); if (m_skipCanvas) m_skipCanvas.OnPause(); } void Update() { if (m_isTouching) { if (!m_isPaused) { if (m_timer > m_skipTime) { if (m_skipCanvas) m_skipCanvas.OnSkip(); OnEndSkip?.Invoke(); // Wywo�anie eventu ko�ca skipowania m_isTouching = false; m_timer = 0f; } if (m_timer > m_quickTapTime && !m_skipImage.gameObject.activeSelf) { ShowSkip(); } m_skipImage.fillAmount = m_timer / m_skipTime; } m_timer += Time.deltaTime; } else if (!m_onlySkip) { if (m_timer > m_quickTapTime) { if (m_tapCounter == 1) { Pause(); } else if (m_tapCounter == 2) { if (m_skipCanvas) m_skipCanvas.OnRestart(); } m_tapCounter = 0; } m_timer += Time.deltaTime; } UpdateShow(); } private void UpdateShow() { if (m_description.gameObject.activeSelf) { if (m_showTimer < m_showTime) { m_description.alpha = m_showCurve.Evaluate(m_showTimer / m_showTime); } else { m_description.gameObject.SetActive(false); } } m_showTimer += Time.unscaledDeltaTime; } private void ShowDescription() { m_showTimer = 0f; m_description.gameObject.SetActive(true); } private void ShowSkip() { m_skipImage.gameObject.SetActive(true); m_skipImage.fillAmount = 0f; OnStartSkip?.Invoke(); // Wywo�anie eventu startu skipowania } public void OnPointerDown(PointerEventData eventData) { ShowDescription(); m_isTouching = true; m_timer = 0f; } public void OnPointerUp(PointerEventData eventData) { if (m_timer < m_quickTapTime) { m_tapCounter++; m_timer = 0f; } if (m_skipImage) { m_skipImage.gameObject.SetActive(false); m_skipImage.fillAmount = 0f; } m_isTouching = false; } public void OnDrag(PointerEventData eventData) { } } }