MobileMenuController.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. namespace SRDebugger.UI
  2. {
  3. using Other;
  4. using SRF;
  5. using UnityEngine;
  6. using UnityEngine.UI;
  7. public class MobileMenuController : SRMonoBehaviourEx
  8. {
  9. private UnityEngine.UI.Button _closeButton;
  10. [SerializeField] private float _maxMenuWidth = 185f;
  11. [SerializeField] private float _peekAmount = 45f;
  12. private float _targetXPosition;
  13. [RequiredField] public RectTransform Content;
  14. [RequiredField] public RectTransform Menu;
  15. [RequiredField] public UnityEngine.UI.Button OpenButton;
  16. [RequiredField] public SRTabController TabController;
  17. public float PeekAmount
  18. {
  19. get { return _peekAmount; }
  20. }
  21. public float MaxMenuWidth
  22. {
  23. get { return _maxMenuWidth; }
  24. }
  25. protected override void OnEnable()
  26. {
  27. base.OnEnable();
  28. var parent = Menu.parent as RectTransform;
  29. var layoutElement = Menu.GetComponent<LayoutElement>();
  30. layoutElement.ignoreLayout = true;
  31. // Set up menu anchors so it stretches to full height and has the screen width
  32. Menu.pivot = new Vector2(1, 1);
  33. Menu.offsetMin = new Vector2(1f, 0f);
  34. Menu.offsetMax = new Vector2(1f, 1f);
  35. Menu.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal,
  36. Mathf.Clamp(parent.rect.width - PeekAmount, 0, MaxMenuWidth));
  37. Menu.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, parent.rect.height);
  38. Menu.anchoredPosition = new Vector2(0, 0);
  39. if (_closeButton == null)
  40. {
  41. CreateCloseButton();
  42. }
  43. OpenButton.gameObject.SetActive(true);
  44. TabController.ActiveTabChanged += TabControllerOnActiveTabChanged;
  45. }
  46. protected override void OnDisable()
  47. {
  48. base.OnDisable();
  49. var layoutElement = Menu.GetComponent<LayoutElement>();
  50. layoutElement.ignoreLayout = false;
  51. // Reset content position in case it has been moved by opening the menu
  52. Content.anchoredPosition = new Vector2(0, 0);
  53. _closeButton.gameObject.SetActive(false);
  54. OpenButton.gameObject.SetActive(false);
  55. TabController.ActiveTabChanged -= TabControllerOnActiveTabChanged;
  56. }
  57. private void CreateCloseButton()
  58. {
  59. var go = new GameObject("SR_CloseButtonCanvas", typeof(RectTransform));
  60. go.transform.SetParent(Content, false);
  61. var c = go.AddComponent<Canvas>();
  62. go.AddComponent<GraphicRaycaster>();
  63. var rect = go.GetComponentOrAdd<RectTransform>();
  64. c.overrideSorting = true;
  65. c.sortingOrder = 122;
  66. go.AddComponent<LayoutElement>().ignoreLayout = true;
  67. SetRectSize(rect);
  68. var cGo = new GameObject("SR_CloseButton", typeof(RectTransform));
  69. cGo.transform.SetParent(rect, false);
  70. var cRect = cGo.GetComponent<RectTransform>();
  71. SetRectSize(cRect);
  72. cGo.AddComponent<Image>().color = new Color(0, 0, 0, 0);
  73. _closeButton = cGo.AddComponent<UnityEngine.UI.Button>();
  74. _closeButton.transition = Selectable.Transition.None;
  75. _closeButton.onClick.AddListener(CloseButtonClicked);
  76. _closeButton.gameObject.SetActive(false);
  77. }
  78. private void SetRectSize(RectTransform rect)
  79. {
  80. rect.anchorMin = new Vector2(0, 0);
  81. rect.anchorMax = new Vector2(1, 1);
  82. rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, Content.rect.width);
  83. rect.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, Content.rect.height);
  84. }
  85. private void CloseButtonClicked()
  86. {
  87. Close();
  88. }
  89. protected override void Update()
  90. {
  91. base.Update();
  92. var from = Content.anchoredPosition.x;
  93. if (Mathf.Abs(_targetXPosition - from) < 2.5f)
  94. {
  95. Content.anchoredPosition = new Vector2(_targetXPosition, Content.anchoredPosition.y);
  96. }
  97. else
  98. {
  99. Content.anchoredPosition =
  100. new Vector2(SRMath.SpringLerp(from, _targetXPosition, 15f, Time.unscaledDeltaTime),
  101. Content.anchoredPosition.y);
  102. }
  103. }
  104. private void TabControllerOnActiveTabChanged(SRTabController srTabController, SRTab srTab)
  105. {
  106. Close();
  107. }
  108. [ContextMenu("Open")]
  109. public void Open()
  110. {
  111. _targetXPosition = Menu.rect.width;
  112. _closeButton.gameObject.SetActive(true);
  113. }
  114. [ContextMenu("Close")]
  115. public void Close()
  116. {
  117. _targetXPosition = 0;
  118. _closeButton.gameObject.SetActive(false);
  119. }
  120. }
  121. }