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.

Renderer2DMenus.cs 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. using System;
  2. using UnityEditor.ProjectWindowCallback;
  3. using UnityEditor.SceneManagement;
  4. using UnityEngine;
  5. using UnityEngine.Rendering.Universal;
  6. using UnityEngine.Rendering;
  7. using System.IO;
  8. using UnityEngine.Analytics;
  9. namespace UnityEditor.Rendering.Universal
  10. {
  11. static class Renderer2DMenus
  12. {
  13. static void Create2DRendererData(Action<Renderer2DData> onCreatedCallback)
  14. {
  15. var instance = ScriptableObject.CreateInstance<Create2DRendererDataAsset>();
  16. instance.onCreated += onCreatedCallback;
  17. ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, instance, "New 2D Renderer Data.asset", null, null);
  18. }
  19. class Create2DRendererDataAsset : EndNameEditAction
  20. {
  21. public event Action<Renderer2DData> onCreated;
  22. public override void Action(int instanceId, string pathName, string resourceFile)
  23. {
  24. var instance = CreateRendererAsset(pathName, RendererType._2DRenderer, false) as Renderer2DData;
  25. Selection.activeObject = instance;
  26. onCreated?.Invoke(instance);
  27. }
  28. }
  29. static ScriptableRendererData CreateRendererAsset(string path, RendererType type, bool relativePath = true, string suffix = "Renderer")
  30. {
  31. string packagePath = "Packages/com.unity.render-pipelines.universal";
  32. ScriptableRendererData data = CreateRendererData(type);
  33. string dataPath;
  34. if (relativePath)
  35. dataPath =
  36. $"{Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path))}_{suffix}{Path.GetExtension(path)}";
  37. else
  38. dataPath = path;
  39. AssetDatabase.CreateAsset(data, dataPath);
  40. ResourceReloader.ReloadAllNullIn(data, packagePath);
  41. return data;
  42. }
  43. static ScriptableRendererData CreateRendererData(RendererType type)
  44. {
  45. var rendererData = ScriptableObject.CreateInstance<Renderer2DData>();
  46. rendererData.postProcessData = PostProcessData.GetDefaultPostProcessData();
  47. return rendererData;
  48. }
  49. internal static void PlaceGameObjectInFrontOfSceneView(GameObject go)
  50. {
  51. var sceneViews = SceneView.sceneViews;
  52. if (sceneViews.Count >= 1)
  53. {
  54. SceneView view = SceneView.lastActiveSceneView;
  55. if (!view)
  56. view = sceneViews[0] as SceneView;
  57. if (view)
  58. view.MoveToView(go.transform);
  59. }
  60. }
  61. // This is from GOCreationCommands
  62. internal static void Place(GameObject go, GameObject parent)
  63. {
  64. if (parent != null)
  65. {
  66. var transform = go.transform;
  67. Undo.SetTransformParent(transform, parent.transform, "Reparenting");
  68. transform.localPosition = Vector3.zero;
  69. transform.localRotation = Quaternion.identity;
  70. transform.localScale = Vector3.one;
  71. go.layer = parent.layer;
  72. if (parent.GetComponent<RectTransform>())
  73. ObjectFactory.AddComponent<RectTransform>(go);
  74. }
  75. else
  76. {
  77. PlaceGameObjectInFrontOfSceneView(go);
  78. StageUtility.PlaceGameObjectInCurrentStage(go); // may change parent
  79. go.transform.position = new Vector3(go.transform.position.x, go.transform.position.y, 0);
  80. }
  81. // Only at this point do we know the actual parent of the object and can modify its name accordingly.
  82. GameObjectUtility.EnsureUniqueNameForSibling(go);
  83. Undo.SetCurrentGroupName("Create " + go.name);
  84. //EditorWindow.FocusWindowIfItsOpen<SceneHierarchyWindow>();
  85. Selection.activeGameObject = go;
  86. }
  87. static Light2D CreateLight(MenuCommand menuCommand, Light2D.LightType type, Vector3[] shapePath = null)
  88. {
  89. GameObject go = ObjectFactory.CreateGameObject("Light 2D", typeof(Light2D));
  90. Light2D light2D = go.GetComponent<Light2D>();
  91. light2D.batchSlotIndex = LightBatch.batchSlotIndex;
  92. light2D.lightType = type;
  93. if (shapePath != null && shapePath.Length > 0)
  94. light2D.shapePath = shapePath;
  95. var parent = menuCommand.context as GameObject;
  96. Place(go, parent);
  97. Analytics.LightDataAnalytic lightData = new Analytics.LightDataAnalytic(light2D.GetInstanceID(), true, light2D.lightType);
  98. Analytics.Renderer2DAnalytics.instance.SendData(lightData);
  99. return light2D;
  100. }
  101. static bool CreateLightValidation()
  102. {
  103. return Light2DEditorUtility.IsUsing2DRenderer();
  104. }
  105. [MenuItem("GameObject/Light/Freeform Light 2D/Square", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.gameObjectMenuPriority + 4)]
  106. static void CreateSquareFreeformLight2D(MenuCommand menuCommand)
  107. {
  108. CreateLight(menuCommand, Light2D.LightType.Freeform, FreeformPathPresets.CreateSquare());
  109. }
  110. [MenuItem("GameObject/Light/Freeform Light 2D/Circle", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.gameObjectMenuPriority + 5)]
  111. static void CreateCircleFreeformLight2D(MenuCommand menuCommand)
  112. {
  113. CreateLight(menuCommand, Light2D.LightType.Freeform, FreeformPathPresets.CreateCircle());
  114. }
  115. [MenuItem("GameObject/Light/Freeform Light 2D/Isometric Diamond", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.gameObjectMenuPriority + 6)]
  116. static void CreateIsometricDiamondFreeformLight2D(MenuCommand menuCommand)
  117. {
  118. CreateLight(menuCommand, Light2D.LightType.Freeform, FreeformPathPresets.CreateIsometricDiamond());
  119. }
  120. [MenuItem("GameObject/Light/Freeform Light 2D/Hexagon Flat Top", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.gameObjectMenuPriority + 7)]
  121. static void CreateHexagonFlatTopFreeformLight2D(MenuCommand menuCommand)
  122. {
  123. CreateLight(menuCommand, Light2D.LightType.Freeform, FreeformPathPresets.CreateHexagonFlatTop());
  124. }
  125. [MenuItem("GameObject/Light/Freeform Light 2D/Hexagon Pointed Top", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.gameObjectMenuPriority + 8)]
  126. static void CreateHexagonPointedTopFreeformLight2D(MenuCommand menuCommand)
  127. {
  128. CreateLight(menuCommand, Light2D.LightType.Freeform, FreeformPathPresets.CreateHexagonPointedTop());
  129. }
  130. [MenuItem("GameObject/Light/Sprite Light 2D", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.gameObjectMenuPriority + 1)]
  131. static void CreateSpriteLight2D(MenuCommand menuCommand)
  132. {
  133. Light2D light = CreateLight(menuCommand, Light2D.LightType.Sprite);
  134. ResourceReloader.ReloadAllNullIn(light, UniversalRenderPipelineAsset.packagePath);
  135. }
  136. [MenuItem("GameObject/Light/Spot Light 2D", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.gameObjectMenuPriority + 2)]
  137. static void CreatePointLight2D(MenuCommand menuCommand)
  138. {
  139. CreateLight(menuCommand, Light2D.LightType.Point);
  140. }
  141. [MenuItem("GameObject/Light/Global Light 2D", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.gameObjectMenuPriority + 3)]
  142. static void CreateGlobalLight2D(MenuCommand menuCommand)
  143. {
  144. CreateLight(menuCommand, Light2D.LightType.Global);
  145. }
  146. [MenuItem("GameObject/Light/Freeform Light 2D/Isometric Diamond", true)]
  147. [MenuItem("GameObject/Light/Freeform Light 2D/Square", true)]
  148. [MenuItem("GameObject/Light/Freeform Light 2D/Circle", true)]
  149. [MenuItem("GameObject/Light/Freeform Light 2D/Hexagon Flat Top", true)]
  150. [MenuItem("GameObject/Light/Freeform Light 2D/Hexagon Pointed Top", true)]
  151. [MenuItem("GameObject/Light/Sprite Light 2D", true)]
  152. [MenuItem("GameObject/Light/Spot Light 2D", true)]
  153. [MenuItem("GameObject/Light/Global Light 2D", true)]
  154. static bool CreateLight2DValidation()
  155. {
  156. return CreateLightValidation();
  157. }
  158. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1812")]
  159. internal class CreateUniversalPipelineAsset : EndNameEditAction
  160. {
  161. public override void Action(int instanceId, string pathName, string resourceFile)
  162. {
  163. //Create asset
  164. AssetDatabase.CreateAsset(UniversalRenderPipelineAsset.Create(CreateRendererAsset(pathName, RendererType._2DRenderer)), pathName);
  165. }
  166. }
  167. [MenuItem("Assets/Create/Rendering/URP Asset (with 2D Renderer)", priority = CoreUtils.Sections.section2 + CoreUtils.Priorities.assetsCreateRenderingMenuPriority)]
  168. static void CreateUniversalPipeline()
  169. {
  170. ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, UniversalRenderPipelineAsset.CreateInstance<CreateUniversalPipelineAsset>(),
  171. "New Universal Render Pipeline Asset.asset", null, null);
  172. }
  173. [MenuItem("Assets/Create/Rendering/URP 2D Renderer", priority = CoreUtils.Sections.section3 + CoreUtils.Priorities.assetsCreateRenderingMenuPriority + 1)]
  174. static void Create2DRendererData()
  175. {
  176. Renderer2DMenus.Create2DRendererData((instance) =>
  177. {
  178. Analytics.RenderAssetAnalytic modifiedData = new Analytics.RenderAssetAnalytic(instance.GetInstanceID(), true, 1, 2);
  179. Analytics.Renderer2DAnalytics.instance.SendData(modifiedData);
  180. });
  181. }
  182. }
  183. }