A game about forced loneliness, made by TACStudios
1using System;
2using System.IO;
3using UnityEngine;
4
5namespace UnityEditor.U2D
6{
7 static internal class ItemCreationUtility
8 {
9 static internal Action<int, ProjectWindowCallback.EndNameEditAction, string, Texture2D, string> StartNewAssetNameEditingDelegate = ProjectWindowUtil.StartNameEditingIfProjectWindowExists;
10
11 static public GameObject CreateGameObject(string name, MenuCommand menuCommand, params Type[] components)
12 {
13 var parent = menuCommand.context as GameObject;
14 var newGO = ObjectFactory.CreateGameObject(name, components);
15 newGO.name = name;
16 Selection.activeObject = newGO;
17 GOCreationCommands.Place(newGO, parent);
18 if (EditorSettings.defaultBehaviorMode == EditorBehaviorMode.Mode2D)
19 {
20 var position = newGO.transform.position;
21 position.z = 0;
22 newGO.transform.position = position;
23 }
24 Undo.RegisterCreatedObjectUndo(newGO, string.Format("Create {0}", name));
25 return newGO;
26 }
27
28 static public T CreateAssetObjectFromTemplate<T>(string sourcePath) where T : UnityEngine.Object
29 {
30 var assetSelectionPath = AssetDatabase.GetAssetPath(Selection.activeObject);
31 var isFolder = false;
32 if (!string.IsNullOrEmpty(assetSelectionPath))
33 isFolder = File.GetAttributes(assetSelectionPath).HasFlag(FileAttributes.Directory);
34 var path = ProjectWindowUtil.GetActiveFolderPath();
35 if (isFolder)
36 {
37 path = assetSelectionPath;
38 }
39 var fileName = Path.GetFileName(sourcePath);
40 var destName = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(path, fileName));
41 var icon = EditorGUIUtility.IconContent<T>().image as Texture2D;
42 StartNewAssetNameEditing(sourcePath, destName, icon, ProjectBrowser.kAssetCreationInstanceID_ForNonExistingAssets);
43 return Selection.activeObject as T;
44 }
45
46 static public T CreateAssetObject<T>(string name) where T : UnityEngine.Object
47 {
48 var assetSelectionPath = AssetDatabase.GetAssetPath(Selection.activeObject);
49 var isFolder = false;
50 if (!string.IsNullOrEmpty(assetSelectionPath))
51 isFolder = File.GetAttributes(assetSelectionPath).HasFlag(FileAttributes.Directory);
52 var path = ProjectWindowUtil.GetActiveFolderPath();
53 if (isFolder)
54 {
55 path = assetSelectionPath;
56 }
57 var destName = AssetDatabase.GenerateUniqueAssetPath(Path.Combine(path, name));
58 var newObject = Activator.CreateInstance<T>();
59 var icon = EditorGUIUtility.IconContent<T>().image as Texture2D;
60 StartNewAssetNameEditing(null, destName, icon, newObject.GetInstanceID());
61 return Selection.activeObject as T;
62 }
63
64 static private void StartNewAssetNameEditing(string source, string dest, Texture2D icon, int instanceId)
65 {
66 var action = ScriptableObject.CreateInstance<CreateAssetEndNameEditAction>();
67 StartNewAssetNameEditingDelegate(instanceId, action, dest, icon, source);
68 }
69
70 internal class CreateAssetEndNameEditAction : ProjectWindowCallback.EndNameEditAction
71 {
72 public override void Action(int instanceId, string pathName, string resourceFile)
73 {
74 var uniqueName = AssetDatabase.GenerateUniqueAssetPath(pathName);
75 if (instanceId == ProjectBrowser.kAssetCreationInstanceID_ForNonExistingAssets && !string.IsNullOrEmpty(resourceFile))
76 {
77 AssetDatabase.CopyAsset(resourceFile, uniqueName);
78 instanceId = AssetDatabase.LoadMainAssetAtPath(uniqueName).GetInstanceID();
79 }
80 else
81 {
82 var obj = EditorUtility.InstanceIDToObject(instanceId);
83 AssetDatabase.CreateAsset(obj, uniqueName);
84 }
85 ProjectWindowUtil.FrameObjectInProjectWindow(instanceId);
86 }
87 }
88 }
89}