88 lines
4.0 KiB
C#
88 lines
4.0 KiB
C#
|
using System;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using UnityEditor.Presets;
|
|||
|
using UnityEditor.U2D.Common;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace UnityEditor.U2D.SpriteShape
|
|||
|
{
|
|||
|
internal static class AssetCreation
|
|||
|
{
|
|||
|
const int k_SpriteShapeAssetMenuPriority = 9;
|
|||
|
static internal Action<int, ProjectWindowCallback.EndNameEditAction, string, Texture2D, string> StartNewAssetNameEditingDelegate = ProjectWindowUtil.StartNameEditingIfProjectWindowExists;
|
|||
|
|
|||
|
[MenuItem("Assets/Create/2D/Sprite Shape Profile", priority = k_SpriteShapeAssetMenuPriority)]
|
|||
|
static void MenuItem_AssetsCreate2DSpriteShapeProfile(MenuCommand menuCommand)
|
|||
|
{
|
|||
|
var asset = AssetDatabase.LoadAssetAtPath<UnityEngine.U2D.SpriteShape>("Packages/com.unity.2d.spriteshape/Editor/ObjectMenuCreation/DefaultAssets/Sprite Shape Profiles/Sprite Shape Profile.asset");
|
|||
|
var preset = new PresetType(asset);
|
|||
|
var defaults = Preset.GetDefaultPresetsForType(preset).Count(x => x.enabled);
|
|||
|
if (defaults == 0)
|
|||
|
CreateAssetObject(asset);
|
|||
|
else
|
|||
|
CreateAssetObject<UnityEngine.U2D.SpriteShape>(null);
|
|||
|
}
|
|||
|
|
|||
|
static public T CreateAssetObject<T>(T obj) where T : UnityEngine.Object
|
|||
|
{
|
|||
|
var assetSelectionPath = AssetDatabase.GetAssetPath(Selection.activeObject);
|
|||
|
var isFolder = false;
|
|||
|
if(!string.IsNullOrEmpty(assetSelectionPath))
|
|||
|
isFolder = File.GetAttributes(assetSelectionPath).HasFlag(FileAttributes.Directory);
|
|||
|
var path = InternalEditorBridge.GetProjectWindowActiveFolderPath();
|
|||
|
if (isFolder)
|
|||
|
{
|
|||
|
path = assetSelectionPath;
|
|||
|
}
|
|||
|
|
|||
|
string resourceFile = "";
|
|||
|
string destName = "";
|
|||
|
int instanceId = 0;
|
|||
|
string fileName = "";
|
|||
|
if (obj != null)
|
|||
|
{
|
|||
|
resourceFile = AssetDatabase.GetAssetPath(obj);
|
|||
|
fileName = System.IO.Path.GetFileName(resourceFile);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
obj = ObjectFactory.CreateInstance<T>();
|
|||
|
instanceId = obj.GetInstanceID();
|
|||
|
fileName = "Sprite Shape Profile.asset";
|
|||
|
}
|
|||
|
destName = AssetDatabase.GenerateUniqueAssetPath(System.IO.Path.Combine(path, fileName));
|
|||
|
var icon = AssetPreview.GetMiniThumbnail(obj);
|
|||
|
StartNewAssetNameEditing(resourceFile, destName, icon, instanceId);
|
|||
|
return Selection.activeObject as T;
|
|||
|
}
|
|||
|
|
|||
|
static private void StartNewAssetNameEditing(string source, string dest, Texture2D icon, int instanceId)
|
|||
|
{
|
|||
|
CreateAssetEndNameEditAction action = ScriptableObject.CreateInstance<CreateAssetEndNameEditAction>();
|
|||
|
StartNewAssetNameEditingDelegate(instanceId, action, dest, icon, source);
|
|||
|
}
|
|||
|
|
|||
|
internal class CreateAssetEndNameEditAction : ProjectWindowCallback.EndNameEditAction
|
|||
|
{
|
|||
|
public override void Action(int instanceId, string pathName, string resourceFile)
|
|||
|
{
|
|||
|
var uniqueName = AssetDatabase.GenerateUniqueAssetPath(pathName);
|
|||
|
// ProjectWindowUtil.StartNameEditingIfProjectWindowExists(int instanceID, EndNameEditAction endAction, string pathName, Texture2D icon, string resourceFile)
|
|||
|
// will reset the instanceId to Int32.MaxValue - 1 if its 0. Looks like a new trunk change ?
|
|||
|
var validInstanceId = (instanceId != 0 && instanceId != InternalEditorBridge.GetAssetCreationInstanceID_ForNonExistingAssets());
|
|||
|
if (!validInstanceId && !string.IsNullOrEmpty(resourceFile))
|
|||
|
{
|
|||
|
AssetDatabase.CopyAsset(resourceFile, uniqueName);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var obj = EditorUtility.InstanceIDToObject(instanceId);
|
|||
|
AssetDatabase.CreateAsset(obj, uniqueName);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|