No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SpriteShapeEditorUtility.cs 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.U2D;
  4. namespace UnityEditor.U2D.SpriteShape
  5. {
  6. internal class SpriteShapeEditorUtility
  7. {
  8. private static class Contents
  9. {
  10. public static readonly string createSpriteShapeString = "Create Sprite Shape";
  11. public static readonly string newSpriteShapeString = "SpriteShape";
  12. }
  13. public const float kMaxSideSize = 2.0f;
  14. public static UnityEngine.U2D.SpriteShape CreateSpriteShapeAsset()
  15. {
  16. UnityEngine.U2D.SpriteShape spriteShape = ScriptableObject.CreateInstance<UnityEngine.U2D.SpriteShape>();
  17. ProjectWindowUtil.CreateAsset(spriteShape, "New SpriteShapeProfile.asset");
  18. Selection.activeObject = spriteShape;
  19. SpriteShapeEditorAnalytics.instance.eventBus.spriteShapeEvent.Invoke(spriteShape);
  20. return spriteShape;
  21. }
  22. public static SpriteShapeController CreateSpriteShapeController(UnityEngine.U2D.SpriteShape shape)
  23. {
  24. var objName = "New SpriteShapeController";
  25. GameObject gameObject = new GameObject(objName, typeof(SpriteShapeController));
  26. SpriteShapeController spriteShapeController = gameObject.GetComponent<SpriteShapeController>();
  27. spriteShapeController.spline.Clear();
  28. if (shape != null)
  29. objName = shape.name;
  30. gameObject.name = GameObjectUtility.GetUniqueNameForSibling(gameObject.transform.parent, objName);
  31. SpriteShapeEditorAnalytics.instance.eventBus.spriteShapeRendererEvent.Invoke(gameObject.GetComponent<SpriteShapeRenderer>());
  32. return spriteShapeController;
  33. }
  34. public static SpriteShapeController CreateSpriteShapeControllerFromSelection()
  35. {
  36. var objName = "New SpriteShapeController";
  37. GameObject gameObject = new GameObject(objName, typeof(SpriteShapeController));
  38. SpriteShapeController spriteShapeController = gameObject.GetComponent<SpriteShapeController>();
  39. if (Selection.activeObject is UnityEngine.U2D.SpriteShape)
  40. {
  41. spriteShapeController.spriteShape = (UnityEngine.U2D.SpriteShape)Selection.activeObject;
  42. objName = spriteShapeController.spriteShape.name;
  43. }
  44. else if (Selection.activeObject is GameObject)
  45. {
  46. var activeGO = (GameObject)Selection.activeObject;
  47. var prefabType = PrefabUtility.GetPrefabAssetType(activeGO);
  48. if (prefabType != PrefabAssetType.Regular && prefabType != PrefabAssetType.Model)
  49. {
  50. GameObjectUtility.SetParentAndAlign(gameObject, activeGO);
  51. }
  52. }
  53. gameObject.name = GameObjectUtility.GetUniqueNameForSibling(gameObject.transform.parent, objName);
  54. Undo.RegisterCreatedObjectUndo(gameObject, Contents.createSpriteShapeString);
  55. Selection.activeGameObject = gameObject;
  56. spriteShapeController.spline.Clear();
  57. SpriteShapeEditorAnalytics.instance.eventBus.spriteShapeRendererEvent.Invoke(gameObject.GetComponent<SpriteShapeRenderer>());
  58. return spriteShapeController;
  59. }
  60. public static void SetShapeFromAsset(SpriteShapeController spriteShapeController)
  61. {
  62. UnityEngine.U2D.SpriteShape spriteShape = spriteShapeController.spriteShape;
  63. if (!spriteShape)
  64. {
  65. SpriteShapeEditorUtility.SetToSquare(spriteShapeController);
  66. return;
  67. }
  68. if (spriteShape.angleRanges.Count == 1 && spriteShape.angleRanges[0].end - spriteShape.angleRanges[0].start == 360f)
  69. SpriteShapeEditorUtility.SetToLine(spriteShapeController);
  70. else if (spriteShape.angleRanges.Count < 8)
  71. SpriteShapeEditorUtility.SetToSquare(spriteShapeController);
  72. else
  73. SpriteShapeEditorUtility.SetToOctogon(spriteShapeController);
  74. }
  75. static void SetToSquare(SpriteShapeController spriteShapeController)
  76. {
  77. spriteShapeController.spline.Clear();
  78. spriteShapeController.spline.InsertPointAt(0, new Vector3(-kMaxSideSize, -kMaxSideSize, 0));
  79. spriteShapeController.spline.InsertPointAt(1, new Vector3(-kMaxSideSize, kMaxSideSize, 0));
  80. spriteShapeController.spline.InsertPointAt(2, new Vector3(kMaxSideSize, kMaxSideSize, 0));
  81. spriteShapeController.spline.InsertPointAt(3, new Vector3(kMaxSideSize, -kMaxSideSize, 0));
  82. }
  83. static void SetToLine(SpriteShapeController spriteShapeController)
  84. {
  85. spriteShapeController.spline.Clear();
  86. spriteShapeController.spline.InsertPointAt(0, new Vector3(-kMaxSideSize, 0.0f, 0));
  87. spriteShapeController.spline.InsertPointAt(1, new Vector3(kMaxSideSize, 0.0f, 0));
  88. spriteShapeController.spline.isOpenEnded = true;
  89. }
  90. static void SetToOctogon(SpriteShapeController spriteShapeController)
  91. {
  92. float kMaxSideSizeHalf = kMaxSideSize * 0.5f;
  93. spriteShapeController.spline.Clear();
  94. spriteShapeController.spline.InsertPointAt(0, new Vector3(-kMaxSideSizeHalf, -kMaxSideSize, 0));
  95. spriteShapeController.spline.InsertPointAt(1, new Vector3(-kMaxSideSize, -kMaxSideSizeHalf, 0));
  96. spriteShapeController.spline.InsertPointAt(2, new Vector3(-kMaxSideSize, kMaxSideSizeHalf, 0));
  97. spriteShapeController.spline.InsertPointAt(3, new Vector3(-kMaxSideSizeHalf, kMaxSideSize, 0));
  98. spriteShapeController.spline.InsertPointAt(4, new Vector3(kMaxSideSizeHalf, kMaxSideSize, 0));
  99. spriteShapeController.spline.InsertPointAt(5, new Vector3(kMaxSideSize, kMaxSideSizeHalf, 0));
  100. spriteShapeController.spline.InsertPointAt(6, new Vector3(kMaxSideSize, -kMaxSideSizeHalf, 0));
  101. spriteShapeController.spline.InsertPointAt(7, new Vector3(kMaxSideSizeHalf, -kMaxSideSize, 0));
  102. }
  103. public static int GetRangeIndexFromAngle(UnityEngine.U2D.SpriteShape spriteShape, float angle)
  104. {
  105. return GetRangeIndexFromAngle(spriteShape.angleRanges, angle);
  106. }
  107. public static int GetRangeIndexFromAngle(List<AngleRange> angleRanges, float angle)
  108. {
  109. for (int i = 0; i < angleRanges.Count; ++i)
  110. {
  111. var angleRange = angleRanges[i];
  112. var range = angleRange.end - angleRange.start;
  113. var angle2 = Mathf.Repeat(angle - angleRange.start, 360f);
  114. if (angle2 >= 0f && angle2 <= range)
  115. return i;
  116. }
  117. return -1;
  118. }
  119. }
  120. }