using System; using System.IO; using UnityEngine; namespace UnityEditor.U2D { static internal class ItemCreationUtility { static internal Action StartNewAssetNameEditingDelegate = ProjectWindowUtil.StartNameEditingIfProjectWindowExists; static public GameObject CreateGameObject(string name, MenuCommand menuCommand, params Type[] components) { var parent = menuCommand.context as GameObject; var newGO = ObjectFactory.CreateGameObject(name, components); newGO.name = name; Selection.activeObject = newGO; GOCreationCommands.Place(newGO, parent); if (EditorSettings.defaultBehaviorMode == EditorBehaviorMode.Mode2D) { var position = newGO.transform.position; position.z = 0; newGO.transform.position = position; } Undo.RegisterCreatedObjectUndo(newGO, string.Format("Create {0}", name)); return newGO; } static public T CreateAssetObjectFromTemplate(string sourcePath) 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 = ProjectWindowUtil.GetActiveFolderPath(); if (isFolder) { path = assetSelectionPath; } var fileName = Path.GetFileName(sourcePath); var destName = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(path, fileName)); var icon = EditorGUIUtility.IconContent().image as Texture2D; StartNewAssetNameEditing(sourcePath, destName, icon, ProjectBrowser.kAssetCreationInstanceID_ForNonExistingAssets); return Selection.activeObject as T; } static public T CreateAssetObject(string name) 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 = ProjectWindowUtil.GetActiveFolderPath(); if (isFolder) { path = assetSelectionPath; } var destName = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(path, name)); var newObject = Activator.CreateInstance(); var icon = EditorGUIUtility.IconContent().image as Texture2D; StartNewAssetNameEditing(null, destName, icon, newObject.GetInstanceID()); return Selection.activeObject as T; } static private void StartNewAssetNameEditing(string source, string dest, Texture2D icon, int instanceId) { var action = ScriptableObject.CreateInstance(); 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); if (instanceId == ProjectBrowser.kAssetCreationInstanceID_ForNonExistingAssets && !string.IsNullOrEmpty(resourceFile)) { AssetDatabase.CopyAsset(resourceFile, uniqueName); instanceId = AssetDatabase.LoadMainAssetAtPath(uniqueName).GetInstanceID(); } else { var obj = EditorUtility.InstanceIDToObject(instanceId); AssetDatabase.CreateAsset(obj, uniqueName); } ProjectWindowUtil.FrameObjectInProjectWindow(instanceId); } } } }