您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字
 
 
 

166 行
3.6 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. [ExecuteInEditMode]
  6. [RequireComponent(typeof(RectTransform))]
  7. public class MarginsAffector : UIBehaviour
  8. {
  9. public void FindElements()
  10. {
  11. this._sizeElements.Clear();
  12. this._affectedElements.Clear();
  13. this._sizeElements.AddRange(base.gameObject.GetComponentsInChildren<MarginSize>(true));
  14. this._affectedElements.AddRange(base.gameObject.GetComponentsInChildren<MarginElement>(true));
  15. }
  16. public void AddSizeElement(MarginSize element)
  17. {
  18. if (!this._sizeElements.Contains(element))
  19. {
  20. this._sizeElements.Add(element);
  21. }
  22. }
  23. public void AddAffectedElement(MarginElement element)
  24. {
  25. if (!this._affectedElements.Contains(element))
  26. {
  27. this._affectedElements.Add(element);
  28. }
  29. }
  30. public void RemoveSizeElement(MarginSize element)
  31. {
  32. this._sizeElements.Remove(element);
  33. }
  34. public void RemoveAffectedElement(MarginElement element)
  35. {
  36. if (this._affectedElements.Contains(element))
  37. {
  38. this._affectedElements.Remove(element);
  39. }
  40. }
  41. public void Recalculate()
  42. {
  43. Vector2 size = new Vector2(-1f, -1f);
  44. for (int i = this._sizeElements.Count - 1; i >= 0; i--)
  45. {
  46. MarginSize marginSize = this._sizeElements[i];
  47. if (marginSize == null)
  48. {
  49. this._sizeElements.RemoveAt(i);
  50. }
  51. else
  52. {
  53. Vector2 preferedElementSize = marginSize.GetPreferedElementSize();
  54. if (marginSize.gameObject.activeInHierarchy && this.GetSizeValue(size) < this.GetSizeValue(preferedElementSize))
  55. {
  56. size = preferedElementSize;
  57. }
  58. }
  59. }
  60. for (int j = this._affectedElements.Count - 1; j >= 0; j--)
  61. {
  62. MarginElement marginElement = this._affectedElements[j];
  63. if (marginElement == null)
  64. {
  65. this._affectedElements.RemoveAt(j);
  66. }
  67. else
  68. {
  69. this.SetSizeValue(marginElement, size);
  70. }
  71. }
  72. }
  73. protected override void OnDisable()
  74. {
  75. for (int i = this._affectedElements.Count - 1; i >= 0; i--)
  76. {
  77. MarginElement marginElement = this._affectedElements[i];
  78. if (marginElement == null)
  79. {
  80. this._affectedElements.RemoveAt(i);
  81. }
  82. else
  83. {
  84. marginElement.AffectSize(null, null);
  85. }
  86. }
  87. }
  88. protected void Update()
  89. {
  90. if (base.transform.hasChanged)
  91. {
  92. this.Recalculate();
  93. }
  94. }
  95. private void SetSizeValue(MarginElement element, Vector2 size)
  96. {
  97. MarginsAffector.MarginType marginType = this._marginType;
  98. if (marginType != MarginsAffector.MarginType.All)
  99. {
  100. if (marginType != MarginsAffector.MarginType.Width)
  101. {
  102. if (marginType == MarginsAffector.MarginType.Height)
  103. {
  104. element.AffectSize(null, new float?(size.y));
  105. }
  106. }
  107. else
  108. {
  109. element.AffectSize(new float?(size.x), null);
  110. }
  111. }
  112. else
  113. {
  114. element.AffectSize(new float?(size.x), new float?(size.y));
  115. }
  116. }
  117. private float GetSizeValue(Vector2 size)
  118. {
  119. MarginsAffector.MarginType marginType = this._marginType;
  120. if (marginType == MarginsAffector.MarginType.All)
  121. {
  122. return size.x + size.y;
  123. }
  124. if (marginType == MarginsAffector.MarginType.Width)
  125. {
  126. return size.x;
  127. }
  128. if (marginType != MarginsAffector.MarginType.Height)
  129. {
  130. return -1f;
  131. }
  132. return size.y;
  133. }
  134. [Header("Options")]
  135. [SerializeField]
  136. private MarginsAffector.MarginType _marginType;
  137. [SerializeField]
  138. [HideInInspector]
  139. private List<MarginSize> _sizeElements = new List<MarginSize>();
  140. [SerializeField]
  141. [HideInInspector]
  142. private List<MarginElement> _affectedElements = new List<MarginElement>();
  143. private RectTransform _rectTransform;
  144. public enum MarginType
  145. {
  146. All,
  147. Width,
  148. Height
  149. }
  150. }