123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- namespace SRDebugger.UI
- {
- using Other;
- using SRF;
- using UnityEngine;
- using UnityEngine.UI;
- public class MobileMenuController : SRMonoBehaviourEx
- {
- private UnityEngine.UI.Button _closeButton;
- [SerializeField] private float _maxMenuWidth = 185f;
- [SerializeField] private float _peekAmount = 45f;
- private float _targetXPosition;
- [RequiredField] public RectTransform Content;
- [RequiredField] public RectTransform Menu;
- [RequiredField] public UnityEngine.UI.Button OpenButton;
- [RequiredField] public SRTabController TabController;
- public float PeekAmount
- {
- get { return _peekAmount; }
- }
- public float MaxMenuWidth
- {
- get { return _maxMenuWidth; }
- }
- protected override void OnEnable()
- {
- base.OnEnable();
- var parent = Menu.parent as RectTransform;
- var layoutElement = Menu.GetComponent<LayoutElement>();
- layoutElement.ignoreLayout = true;
- // Set up menu anchors so it stretches to full height and has the screen width
- Menu.pivot = new Vector2(1, 1);
- Menu.offsetMin = new Vector2(1f, 0f);
- Menu.offsetMax = new Vector2(1f, 1f);
- Menu.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal,
- Mathf.Clamp(parent.rect.width - PeekAmount, 0, MaxMenuWidth));
- Menu.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, parent.rect.height);
- Menu.anchoredPosition = new Vector2(0, 0);
- if (_closeButton == null)
- {
- CreateCloseButton();
- }
- OpenButton.gameObject.SetActive(true);
- TabController.ActiveTabChanged += TabControllerOnActiveTabChanged;
- }
- protected override void OnDisable()
- {
- base.OnDisable();
- var layoutElement = Menu.GetComponent<LayoutElement>();
- layoutElement.ignoreLayout = false;
- // Reset content position in case it has been moved by opening the menu
- Content.anchoredPosition = new Vector2(0, 0);
- _closeButton.gameObject.SetActive(false);
- OpenButton.gameObject.SetActive(false);
- TabController.ActiveTabChanged -= TabControllerOnActiveTabChanged;
- }
- private void CreateCloseButton()
- {
- var go = new GameObject("SR_CloseButtonCanvas", typeof(RectTransform));
- go.transform.SetParent(Content, false);
- var c = go.AddComponent<Canvas>();
- go.AddComponent<GraphicRaycaster>();
- var rect = go.GetComponentOrAdd<RectTransform>();
- c.overrideSorting = true;
- c.sortingOrder = 122;
- go.AddComponent<LayoutElement>().ignoreLayout = true;
- SetRectSize(rect);
- var cGo = new GameObject("SR_CloseButton", typeof(RectTransform));
- cGo.transform.SetParent(rect, false);
- var cRect = cGo.GetComponent<RectTransform>();
- SetRectSize(cRect);
- cGo.AddComponent<Image>().color = new Color(0, 0, 0, 0);
- _closeButton = cGo.AddComponent<UnityEngine.UI.Button>();
- _closeButton.transition = Selectable.Transition.None;
- _closeButton.onClick.AddListener(CloseButtonClicked);
- _closeButton.gameObject.SetActive(false);
- }
- private void SetRectSize(RectTransform rect)
- {
- rect.anchorMin = new Vector2(0, 0);
- rect.anchorMax = new Vector2(1, 1);
- rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Content.rect.width);
- rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Content.rect.height);
- }
- private void CloseButtonClicked()
- {
- Close();
- }
- protected override void Update()
- {
- base.Update();
- var from = Content.anchoredPosition.x;
- if (Mathf.Abs(_targetXPosition - from) < 2.5f)
- {
- Content.anchoredPosition = new Vector2(_targetXPosition, Content.anchoredPosition.y);
- }
- else
- {
- Content.anchoredPosition =
- new Vector2(SRMath.SpringLerp(from, _targetXPosition, 15f, Time.unscaledDeltaTime),
- Content.anchoredPosition.y);
- }
- }
- private void TabControllerOnActiveTabChanged(SRTabController srTabController, SRTab srTab)
- {
- Close();
- }
- [ContextMenu("Open")]
- public void Open()
- {
- _targetXPosition = Menu.rect.width;
- _closeButton.gameObject.SetActive(true);
- }
- [ContextMenu("Close")]
- public void Close()
- {
- _targetXPosition = 0;
- _closeButton.gameObject.SetActive(false);
- }
- }
- }
|