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.

AssetCreation.cs 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using UnityEditor.Presets;
  5. using UnityEditor.U2D.Common;
  6. using UnityEngine;
  7. namespace UnityEditor.U2D.SpriteShape
  8. {
  9. internal static class AssetCreation
  10. {
  11. const int k_SpriteShapeAssetMenuPriority = 9;
  12. static internal Action<int, ProjectWindowCallback.EndNameEditAction, string, Texture2D, string> StartNewAssetNameEditingDelegate = ProjectWindowUtil.StartNameEditingIfProjectWindowExists;
  13. [MenuItem("Assets/Create/2D/Sprite Shape Profile", priority = k_SpriteShapeAssetMenuPriority)]
  14. static void MenuItem_AssetsCreate2DSpriteShapeProfile(MenuCommand menuCommand)
  15. {
  16. var asset = AssetDatabase.LoadAssetAtPath<UnityEngine.U2D.SpriteShape>("Packages/com.unity.2d.spriteshape/Editor/ObjectMenuCreation/DefaultAssets/Sprite Shape Profiles/Sprite Shape Profile.asset");
  17. var preset = new PresetType(asset);
  18. var defaults = Preset.GetDefaultPresetsForType(preset).Count(x => x.enabled);
  19. if (defaults == 0)
  20. CreateAssetObject(asset);
  21. else
  22. CreateAssetObject<UnityEngine.U2D.SpriteShape>(null);
  23. }
  24. static public T CreateAssetObject<T>(T obj) where T : UnityEngine.Object
  25. {
  26. var assetSelectionPath = AssetDatabase.GetAssetPath(Selection.activeObject);
  27. var isFolder = false;
  28. if(!string.IsNullOrEmpty(assetSelectionPath))
  29. isFolder = File.GetAttributes(assetSelectionPath).HasFlag(FileAttributes.Directory);
  30. var path = InternalEditorBridge.GetProjectWindowActiveFolderPath();
  31. if (isFolder)
  32. {
  33. path = assetSelectionPath;
  34. }
  35. string resourceFile = "";
  36. string destName = "";
  37. int instanceId = 0;
  38. string fileName = "";
  39. if (obj != null)
  40. {
  41. resourceFile = AssetDatabase.GetAssetPath(obj);
  42. fileName = System.IO.Path.GetFileName(resourceFile);
  43. }
  44. else
  45. {
  46. obj = ObjectFactory.CreateInstance<T>();
  47. instanceId = obj.GetInstanceID();
  48. fileName = "Sprite Shape Profile.asset";
  49. }
  50. destName = AssetDatabase.GenerateUniqueAssetPath(System.IO.Path.Combine(path, fileName));
  51. var icon = AssetPreview.GetMiniThumbnail(obj);
  52. StartNewAssetNameEditing(resourceFile, destName, icon, instanceId);
  53. return Selection.activeObject as T;
  54. }
  55. static private void StartNewAssetNameEditing(string source, string dest, Texture2D icon, int instanceId)
  56. {
  57. CreateAssetEndNameEditAction action = ScriptableObject.CreateInstance<CreateAssetEndNameEditAction>();
  58. StartNewAssetNameEditingDelegate(instanceId, action, dest, icon, source);
  59. }
  60. internal class CreateAssetEndNameEditAction : ProjectWindowCallback.EndNameEditAction
  61. {
  62. public override void Action(int instanceId, string pathName, string resourceFile)
  63. {
  64. var uniqueName = AssetDatabase.GenerateUniqueAssetPath(pathName);
  65. // ProjectWindowUtil.StartNameEditingIfProjectWindowExists(int instanceID, EndNameEditAction endAction, string pathName, Texture2D icon, string resourceFile)
  66. // will reset the instanceId to Int32.MaxValue - 1 if its 0. Looks like a new trunk change ?
  67. var validInstanceId = (instanceId != 0 && instanceId != InternalEditorBridge.GetAssetCreationInstanceID_ForNonExistingAssets());
  68. if (!validInstanceId && !string.IsNullOrEmpty(resourceFile))
  69. {
  70. AssetDatabase.CopyAsset(resourceFile, uniqueName);
  71. }
  72. else
  73. {
  74. var obj = EditorUtility.InstanceIDToObject(instanceId);
  75. AssetDatabase.CreateAsset(obj, uniqueName);
  76. }
  77. }
  78. }
  79. }
  80. }