Guest User

Untitled

a guest
Nov 18th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.17 KB | None | 0 0
  1. using UnityEngine;
  2.  
  3. public static class RectTransformExtensions
  4. {
  5. /// <summary>
  6. /// 座標を保ったままPivotを変更する
  7. /// </summary>
  8. /// <param name="rectTransform">自身の参照</param>
  9. /// <param name="targetPivot">変更先のPivot座標</param>
  10. public static void SetPivotWithKeepingPosition(this RectTransform rectTransform, Vector2 targetPivot)
  11. {
  12. var diffPivot = targetPivot - rectTransform.pivot;
  13. rectTransform.pivot = targetPivot;
  14. var diffPos = new Vector2(rectTransform.sizeDelta.x * diffPivot.x, rectTransform.sizeDelta.y * diffPivot.y);
  15. rectTransform.anchoredPosition += diffPos;
  16. }
  17. /// <summary>
  18. /// 座標を保ったままPivotを変更する
  19. /// </summary>
  20. /// <param name="rectTransform">自身の参照</param>
  21. /// <param name="x">変更先のPivotのx座標</param>
  22. /// <param name="y">変更先のPivotのy座標</param>
  23. public static void SetPivotWithKeepingPosition(this RectTransform rectTransform, int x, int y)
  24. {
  25. rectTransform.SetPivotWithKeepingPosition(new Vector2(x, y));
  26. }
  27. /// <summary>
  28. /// 座標を保ったままAnchorを変更する
  29. /// </summary>
  30. /// <param name="rectTransform">自身の参照</param>
  31. /// <param name="targetAnchor">変更先のAnchor座標 (min,maxが共通の場合)</param>
  32. public static void SetAnchorWithKeepingPosition(this RectTransform rectTransform, Vector2 targetAnchor)
  33. {
  34. rectTransform.SetAnchorWithKeepingPosition(targetAnchor, targetAnchor);
  35. }
  36. /// <summary>
  37. /// 座標を保ったままAnchorを変更する
  38. /// </summary>
  39. /// <param name="rectTransform">自身の参照</param>
  40. /// <param name="x">変更先のAnchorのx座標 (min,maxが共通の場合)</param>
  41. /// <param name="y">変更先のAnchorのy座標 (min,maxが共通の場合)</param>
  42. public static void SetAnchorWithKeepingPosition(this RectTransform rectTransform, int x, int y)
  43. {
  44. rectTransform.SetAnchorWithKeepingPosition(new Vector2(x, y));
  45. }
  46. /// <summary>
  47. /// 座標を保ったままAnchorを変更する
  48. /// </summary>
  49. /// <param name="rectTransform">自身の参照</param>
  50. /// <param name="targetMinAnchor">変更先のAnchorMin座標</param>
  51. /// <param name="targetMaxAnchor">変更先のAnchorMax座標</param>
  52. public static void SetAnchorWithKeepingPosition(this RectTransform rectTransform, Vector2 targetMinAnchor, Vector2 targetMaxAnchor)
  53. {
  54. var parent = rectTransform.parent as RectTransform;
  55. if (parent == null)
  56. {
  57. Debug.LogError("nullreferenceexception: Parent cannot find.");
  58. }
  59. var diffMin = targetMinAnchor - rectTransform.anchorMin;
  60. var diffMax = targetMaxAnchor - rectTransform.anchorMax;
  61. // anchorの更新
  62. rectTransform.anchorMin = targetMinAnchor;
  63. rectTransform.anchorMax = targetMaxAnchor;
  64. // 上下左右の距離の差分を計算
  65. var diffLeft = parent.rect.width * diffMin.x;
  66. var diffRight = parent.rect.width * diffMax.x;
  67. var diffBottom = parent.rect.height * diffMin.y;
  68. var diffTop = parent.rect.height * diffMax.y;
  69. // サイズと座標の修正
  70. rectTransform.sizeDelta += new Vector2(diffLeft - diffRight, diffBottom - diffTop);
  71. var pivot = rectTransform.pivot;
  72. rectTransform.anchoredPosition -= new Vector2(
  73. (diffLeft * (1 - pivot.x)) + (diffRight * pivot.x),
  74. (diffBottom * (1 - pivot.y)) + (diffTop * pivot.y)
  75. );
  76. }
  77. /// <summary>
  78. /// 座標を保ったままAnchorを変更する
  79. /// </summary>
  80. /// <param name="rectTransform">自身の参照</param>
  81. /// <param name="minX">変更先のAnchorMinのx座標</param>
  82. /// <param name="minY">変更先のAnchorMinのy座標</param>
  83. /// <param name="maxX">変更先のAnchorMaxのx座標</param>
  84. /// <param name="maxY">変更先のAnchorMaxのy座標</param>
  85. public static void SetAnchorWithKeepingPosition(this RectTransform rectTransform, int minX, int minY, int maxX, int maxY)
  86. {
  87. rectTransform.SetAnchorWithKeepingPosition(new Vector2(minX, minY), new Vector2(maxX, maxY));
  88. }
  89. }
Add Comment
Please, Sign In to add comment