using System; using DG.Tweening; using UnityEngine; using Utils; namespace Ui.Screens { [RequireComponent(typeof(RectTransform))] public class ScreenContainer : MonoBehaviour { private static ScreenContainer _instance; public static ScreenContainer Instance { get { return _instance; } } [SerializeField] private ScreenSelector _selector; [SerializeField] private RectTransform _container; [SerializeField] private int _rectWidth; [SerializeField] private float _threshold; [SerializeField] private int _leftScreens; [SerializeField] private int _rightScreens; private bool _dragStart; private static bool _hold; public static bool Hold { get { return _hold; } set { _hold = value; if (_hold) Debug.Log("Hold true!"); else Debug.Log("Hold false!"); } } private int _scene; private float _position; private float _containerPosition; private float _currentPosition; private float ContainerPosition { get { return _containerPosition; } set { var targetValue = value < 0 && value < -_leftScreens * _rectWidth ? -_leftScreens * _rectWidth : value > 0 && value > _rightScreens * _rectWidth ? _rightScreens * _rectWidth : value; _container.SetRight(-targetValue); _container.SetLeft(targetValue); _containerPosition = targetValue; } } private void Awake() { _instance = this; } private void OnDisable() { _hold = false; } public static event Action DragEvent; private void Drag() { if (GlobalsVar.gBoard.DialogsCount > 0) return; if (_dragStart) return; _dragStart = true; _position = Input.mousePosition.x; } private void Update() { if (GlobalsVar.gSkipClickTime > 0f) { if (_dragStart) _dragStart = false; return; } if (_hold) { if (_dragStart) { GlobalsVar.gOnMenuDrag = true; SetNewPosition(); } return; } if (Input.GetMouseButton(0)) { Drag(); } if (!_dragStart) return; if (!Input.GetMouseButton(0)) { SetNewPosition(); return; } ChangeDragPosition(); } private void SetNewPosition() { _dragStart = false; var targetScene = Input.mousePosition.x - _position < -(_threshold * Screen.width) ? _scene - 1 : Input.mousePosition.x - _position > (_threshold * Screen.width) ? _scene + 1 : _scene; SetNewPosition(targetScene); } public void SetNewPosition(int scene) { _scene = scene > _rightScreens ? _rightScreens : scene < -_leftScreens ? -_leftScreens : scene; _hold = true; Debug.Log("Hold true!"); _currentPosition = _rectWidth * _scene; DOTween.To(() => ContainerPosition, x => ContainerPosition = x, _rectWidth * _scene, 0.5f).OnComplete(() => { GlobalsVar.gOnMenuDrag = false; _hold = false; Debug.Log("Hold false!"); _dragEvent = false; if (DragEvent != null) DragEvent(false); }); if (_selector != null) _selector.SetButton(_scene + 2); } private bool _dragEvent; private void ChangeDragPosition() { var currentPoint = _currentPosition + (Input.mousePosition.x - _position) * (_rectWidth / (float)Screen.width); if (Mathf.Abs(Input.mousePosition.x - _position) > 0.05 * Screen.width && !_dragEvent) { _dragEvent = true; if (DragEvent != null) DragEvent(true); } ContainerPosition = currentPoint; } private void OnValidate() { if (_container == null) _container = gameObject.GetComponent(); } } }