Files
beyond/Assets/Scripts/UI/SkipButton.cs
2024-11-20 15:21:28 +01:00

160 lines
4.4 KiB
C#
Raw Blame History

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<SkipCanvas>();
}
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<77>anie eventu ko<6B>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<77>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)
{
}
}
}