ZAxisLayoutGroup3D.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace AutoLayout3D
  5. {
  6. public class ZAxisLayoutGroup3D : LayoutGroup3D
  7. {
  8. public float spacing;
  9. public AxisAlignment childAlignmentX = AxisAlignment.Middle;
  10. public AxisAlignment childAlignmentY = AxisAlignment.Middle;
  11. public AxisAlignment childAlignmentZ = AxisAlignment.Middle;
  12. public Direction childDirection = Direction.LowerToUpper;
  13. public Bool3 childControlSize = new Bool3();
  14. public Bool3 childForceExpand = new Bool3();
  15. public override void UpdateLayout()
  16. {
  17. elementList.Clear();
  18. float sum = 0.0f;
  19. foreach (Transform child in transform)
  20. {
  21. LayoutElement3D element = child.GetComponent<LayoutElement3D>();
  22. if (!child.gameObject.activeSelf || element == null) continue;
  23. elementList.Add(element);
  24. sum += element.size.z * element.transform.localScale.z;
  25. }
  26. float sum_withSpace = sum + spacing * (elementList.Count - 1);
  27. Vector3 c_size = new Vector3();
  28. c_size.x = size.x - padding.lower.x - padding.upper.x;
  29. c_size.y = size.y - padding.lower.y - padding.upper.y;
  30. c_size.z = size.z - padding.lower.z - padding.upper.z;
  31. Vector3 c_center = center;
  32. c_center.x += (padding.lower.x - padding.upper.x) * 0.5f;
  33. c_center.y += (padding.lower.y - padding.upper.y) * 0.5f;
  34. c_center.z += (padding.lower.z - padding.upper.z) * 0.5f;
  35. Vector3 direction = Vector3.zero;
  36. Vector3 offset = Vector3.zero;
  37. direction.z = childDirection == Direction.LowerToUpper ? 1.0f : -1.0f;
  38. switch (childAlignmentZ)
  39. {
  40. case AxisAlignment.Lower:
  41. offset.z = -c_size.z * 0.5f;
  42. if (childDirection == Direction.UpperToLower) offset.z += sum_withSpace;
  43. break;
  44. case AxisAlignment.Middle:
  45. offset.z = -direction.z * sum_withSpace * 0.5f;
  46. break;
  47. case AxisAlignment.Upper:
  48. offset.z = c_size.z * 0.5f;
  49. if (childDirection == Direction.LowerToUpper) offset.z -= sum_withSpace;
  50. break;
  51. }
  52. switch (childAlignmentX)
  53. {
  54. case AxisAlignment.Lower:
  55. direction.x = 1.0f;
  56. break;
  57. case AxisAlignment.Middle:
  58. direction.x = 0.0f;
  59. break;
  60. case AxisAlignment.Upper:
  61. direction.x = -1.0f;
  62. break;
  63. }
  64. offset.x = -direction.x * c_size.x * 0.5f;
  65. switch (childAlignmentY)
  66. {
  67. case AxisAlignment.Lower:
  68. direction.y = 1.0f;
  69. break;
  70. case AxisAlignment.Middle:
  71. direction.y = 0.0f;
  72. break;
  73. case AxisAlignment.Upper:
  74. direction.y = -1.0f;
  75. break;
  76. }
  77. offset.y = -direction.y * c_size.y * 0.5f;
  78. float c_spacing = spacing;
  79. Vector3 scaleFactor = Vector3.zero;
  80. if (childForceExpand.z)
  81. {
  82. offset.z = -direction.z * c_size.z * 0.5f;
  83. scaleFactor.z = (c_size.z - (c_spacing * (elementList.Count - 1))) / elementList.Count;
  84. if (!childControlSize.x && sum_withSpace < c_size.z) c_spacing = (c_size.z - sum) / (elementList.Count - 1);
  85. }
  86. if (childForceExpand.x) scaleFactor.x = c_size.x;
  87. if (childForceExpand.y) scaleFactor.y = c_size.y;
  88. foreach (LayoutElement3D element in elementList)
  89. {
  90. Vector3 scale = element.transform.localScale;
  91. if (childControlSize.x) scale.x = scaleFactor.x / element.size.x;
  92. if (childControlSize.y) scale.y = scaleFactor.y / element.size.y;
  93. if (childControlSize.z) scale.z = scaleFactor.z / element.size.z;
  94. element.transform.localScale = scale;
  95. Vector3 elementSize = Vector3.one;
  96. elementSize.x = element.size.x * scale.x;
  97. elementSize.y = element.size.y * scale.y;
  98. elementSize.z = element.size.z * scale.z;
  99. Vector3 elementOffset = Vector3.one;
  100. elementOffset.x = elementSize.x * 0.5f * direction.x - element.center.x * scale.x;
  101. elementOffset.y = elementSize.y * 0.5f * direction.y - element.center.y * scale.y;
  102. elementOffset.z = elementSize.z * 0.5f * direction.z - element.center.z * scale.z;
  103. element.transform.localPosition = c_center + offset + elementOffset;
  104. offset.z += (elementSize.z + c_spacing) * direction.z;
  105. }
  106. elementList.Clear();
  107. }
  108. }
  109. }