diff --git a/Editor/SettingTemplate/setting.fbx b/Editor/SettingTemplate/setting.fbx index f1bd0502e..0dc987b5b 100644 Binary files a/Editor/SettingTemplate/setting.fbx and b/Editor/SettingTemplate/setting.fbx differ diff --git a/Editor/SettingTemplate/setting.fbx.meta b/Editor/SettingTemplate/setting.fbx.meta index eb209fedf..ef2aa9e16 100644 --- a/Editor/SettingTemplate/setting.fbx.meta +++ b/Editor/SettingTemplate/setting.fbx.meta @@ -1,17 +1,34 @@ fileFormatVersion: 2 guid: 18678a28cef624aeb89c5717c46be35b -timeCreated: 1494625790 -licenseType: Pro ModelImporter: - serializedVersion: 19 - fileIDToRecycleName: - 100000: //RootNode - 400000: //RootNode - 9500000: //RootNode + serializedVersion: 19301 + internalIDToNameTable: + - first: + 1: 100000 + second: //RootNode + - first: + 4: 400000 + second: //RootNode + - first: + 95: 9500000 + second: //RootNode + - first: + 74: -5187248419258813496 + second: Plane|PlaneAction + - first: + 74: 1799862611652281773 + second: Plane|Plane|Plane|PlaneAction|Plane|PlaneAction + externalObjects: + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: No Name + second: {fileID: 2100000, guid: 491673517a8e80748b95de0431d567b8, type: 2} materials: - importMaterials: 1 + materialImportMode: 0 materialName: 0 materialSearch: 1 + materialLocation: 0 animations: legacyGenerateAnimations: 4 bakeSimulation: 0 @@ -24,12 +41,15 @@ ModelImporter: animationImportWarnings: animationRetargetingWarnings: animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 animationCompression: 1 animationRotationError: 0.5 animationPositionError: 0.5 animationScaleError: 0.5 animationWrapMode: 0 extraExposedTransformPaths: [] + extraUserProperties: [] clipAnimations: [] isReadable: 1 meshes: @@ -37,13 +57,24 @@ ModelImporter: globalScale: 1 meshCompression: 0 addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 0 importBlendShapes: 1 + importCameras: 0 + importLights: 0 + fileIdsGeneration: 1 swapUVChannels: 0 generateSecondaryUV: 0 useFileUnits: 1 - optimizeMeshForGPU: 1 keepQuads: 0 weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 1 secondaryUVAngleDistortion: 8 secondaryUVAreaDistortion: 15.000001 secondaryUVHardAngle: 88 @@ -53,10 +84,14 @@ ModelImporter: normalSmoothAngle: 60 normalImportMode: 0 tangentImportMode: 3 + normalCalculationMode: 0 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 1 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] importAnimation: 1 - copyAvatar: 0 humanDescription: - serializedVersion: 2 + serializedVersion: 3 human: [] skeleton: [] armTwist: 0.5 @@ -66,14 +101,16 @@ ModelImporter: armStretch: 0.05 legStretch: 0.05 feetSpacing: 0 + globalScale: 1 rootMotionBoneName: - rootMotionBoneRotation: {x: 0, y: 0, z: 0, w: 1} hasTranslationDoF: 0 hasExtraRoot: 0 skeletonHasParents: 1 lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 animationType: 2 humanoidOversampling: 1 + avatarSetup: 1 additionalBone: 0 userData: assetBundleName: diff --git a/Editor/SettingTemplate/setting.m4v.meta b/Editor/SettingTemplate/setting.m4v.meta index a01a3eb10..fafacdd6c 100644 --- a/Editor/SettingTemplate/setting.m4v.meta +++ b/Editor/SettingTemplate/setting.m4v.meta @@ -3,9 +3,6 @@ guid: 995c7b348de57438c891b65236c1d7b2 VideoClipImporter: externalObjects: {} serializedVersion: 2 - useLegacyImporter: 0 - quality: 0.5 - isColorLinear: 0 frameRange: 0 startFrame: -1 endFrame: -1 diff --git a/Editor/System/Core/AssetGraphPostprocessor.cs b/Editor/System/Core/AssetGraphPostprocessor.cs index fa7d9260e..3da12d09d 100644 --- a/Editor/System/Core/AssetGraphPostprocessor.cs +++ b/Editor/System/Core/AssetGraphPostprocessor.cs @@ -144,7 +144,7 @@ private void DoPostprocessWithContext(AssetPostprocessorContext ctx) { private void NotifyAssetPostprocessorGraphs(AssetPostprocessorContext ctx) { - var guids = AssetDatabase.FindAssets(Model.Settings.GRAPH_SEARCH_CONDITION); + var guids = AssetDatabase.FindAssets(Model.Settings.GRAPH_SEARCH_CONDITION, new string[] { "Assets" }); var executingGraphs = new List (); diff --git a/Editor/System/Filters/FilterByNameAndType.cs b/Editor/System/Filters/FilterByNameAndType.cs index 03a61082b..5ae4a465f 100644 --- a/Editor/System/Filters/FilterByNameAndType.cs +++ b/Editor/System/Filters/FilterByNameAndType.cs @@ -45,7 +45,7 @@ public bool FilterAsset(AssetReference a) { CheckVersionAndUpgrade (); bool keywordMatch = Regex.IsMatch(a.importFrom, m_filterKeyword, - RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); + RegexOptions.IgnorePatternWhitespace); bool match = keywordMatch; diff --git a/Editor/System/Importers/ModelImporterConfigurator.cs b/Editor/System/Importers/ModelImporterConfigurator.cs index bbb73533a..349beb574 100644 --- a/Editor/System/Importers/ModelImporterConfigurator.cs +++ b/Editor/System/Importers/ModelImporterConfigurator.cs @@ -158,8 +158,15 @@ private bool IsEqual(ModelImporter target, ModelImporter reference) if (Math.Abs(target.clipAnimations[i].additiveReferencePoseFrame - reference.clipAnimations[i].additiveReferencePoseFrame) > kTOLERANCE) return false; - if (target.clipAnimations[i].curves != reference.clipAnimations[i].curves) + if (target.clipAnimations[i].curves.Length != reference.clipAnimations[i].curves.Length) return false; + for (var j = 0; j < target.clipAnimations[i].curves.Length; ++j) + { + if (target.clipAnimations[i].curves[j].name != reference.clipAnimations[i].curves[j].name) + return false; + if (!target.clipAnimations[i].curves[j].curve.Equals(reference.clipAnimations[i].curves[j].curve)) + return false; + } if (Math.Abs(target.clipAnimations[i].cycleOffset - reference.clipAnimations[i].cycleOffset) > kTOLERANCE) return false; @@ -326,12 +333,15 @@ private bool IsEqual(ModelImporter target, ModelImporter reference) return false; #if UNITY_2019_2_OR_NEWER - if (target.maxBonesPerVertex != reference.maxBonesPerVertex) - return false; + if (reference.skinWeights == ModelImporterSkinWeights.Custom) + { + if (target.maxBonesPerVertex != reference.maxBonesPerVertex) + return false; + if (Math.Abs(target.minBoneWeight - reference.minBoneWeight) > kTOLERANCE) + return false; + } if (target.meshOptimizationFlags != reference.meshOptimizationFlags) return false; - if (Math.Abs(target.minBoneWeight - reference.minBoneWeight) > kTOLERANCE) - return false; if (target.skinWeights != reference.skinWeights) return false; if (target.sortHierarchyByName != reference.sortHierarchyByName) @@ -427,9 +437,6 @@ private void OverwriteImportSettings(ModelImporter target, ModelImporter referen target.animationType = reference.animationType; target.animationWrapMode = reference.animationWrapMode; -#if UNITY_2019_3_OR_NEWER - target.avatarSetup = reference.avatarSetup; -#endif target.bakeIK = reference.bakeIK; if (reference.importAnimation && m_overwriteAnimationClipSettings) @@ -475,14 +482,17 @@ private void OverwriteImportSettings(ModelImporter target, ModelImporter referen target.materialSearch = reference.materialSearch; #if UNITY_2019_2_OR_NEWER - target.maxBonesPerVertex = reference.maxBonesPerVertex; + if (reference.skinWeights == ModelImporterSkinWeights.Custom) + { + target.maxBonesPerVertex = reference.maxBonesPerVertex; + target.minBoneWeight = reference.minBoneWeight; + } #endif target.meshCompression = reference.meshCompression; #if UNITY_2019_2_OR_NEWER target.meshOptimizationFlags = reference.meshOptimizationFlags; - target.minBoneWeight = reference.minBoneWeight; #endif target.motionNodeName = reference.motionNodeName; @@ -517,6 +527,10 @@ private void OverwriteImportSettings(ModelImporter target, ModelImporter referen target.useFileUnits = reference.useFileUnits; target.useSRGBMaterialColor = reference.useSRGBMaterialColor; target.weldVertices = reference.weldVertices; + +#if UNITY_2019_3_OR_NEWER + target.avatarSetup = reference.avatarSetup; +#endif } } } \ No newline at end of file diff --git a/Editor/System/Model/SerializableMultiTargetInstance.cs b/Editor/System/Model/SerializableMultiTargetInstance.cs index 82674747d..8a6f1231d 100644 --- a/Editor/System/Model/SerializableMultiTargetInstance.cs +++ b/Editor/System/Model/SerializableMultiTargetInstance.cs @@ -32,6 +32,9 @@ public T Get () { [SerializeField] private string m_className; [SerializeField] private List m_values; + MonoScript m_Monoscript; + public MonoScript MonoScript => m_Monoscript ?? (m_Monoscript = TypeUtility.LoadMonoScript(ClassName)); + public SerializableMultiTargetInstance(SerializableMultiTargetInstance rhs) { m_className = rhs.m_className; m_values = new List(rhs.m_values.Count); @@ -156,7 +159,7 @@ public void Set(BuildTargetGroup g, object value) { } int i = m_values.FindIndex(v => v.targetGroup == g); - var json = CustomScriptUtility.EncodeString(JsonUtility.ToJson(value)); + var json = CustomScriptUtility.EncodeString(EditorJsonUtility.ToJson(value)); if(i >= 0) { m_values [i].value = json; m_values [i].instance = value; @@ -203,7 +206,9 @@ public T GetDefaultValue() { return default(T); } UnityEngine.Assertions.Assert.IsTrue( typeof(T).IsAssignableFrom(t) ); - return (T) JsonUtility.FromJson(CustomScriptUtility.DecodeString(m_values[i].value), t); + var instanse = (T)Activator.CreateInstance(t); + EditorJsonUtility.FromJsonOverwrite(CustomScriptUtility.DecodeString(m_values[i].value), instanse); + return instanse; } else { return default(T); } diff --git a/Editor/System/Model/SerializedInstance.cs b/Editor/System/Model/SerializedInstance.cs index aec7c2cfb..a52fe3a04 100644 --- a/Editor/System/Model/SerializedInstance.cs +++ b/Editor/System/Model/SerializedInstance.cs @@ -1,4 +1,5 @@ using System; +using UnityEditor; namespace UnityEngine.AssetGraph { [System.Serializable] @@ -44,7 +45,7 @@ public SerializedInstance(T obj) { UnityEngine.Assertions.Assert.IsNotNull(obj); m_className = obj.GetType().AssemblyQualifiedName; - m_instanceData = CustomScriptUtility.EncodeString(JsonUtility.ToJson(obj)); + m_instanceData = CustomScriptUtility.EncodeString(EditorJsonUtility.ToJson(obj)); } public void OnBeforeSerialize() @@ -69,7 +70,9 @@ private T Deserialize() { if(!string.IsNullOrEmpty(m_instanceData) && instanceType != null) { string data = CustomScriptUtility.DecodeString(m_instanceData); - return (T)JsonUtility.FromJson(data, instanceType); + var instance = System.Activator.CreateInstance(instanceType) as T; + EditorJsonUtility.FromJsonOverwrite(data, instance); + return instance; } return default(T); @@ -78,7 +81,7 @@ private T Deserialize() { public void Save() { if(m_object != null) { m_className = m_object.GetType().AssemblyQualifiedName; - m_instanceData = CustomScriptUtility.EncodeString(JsonUtility.ToJson(m_object)); + m_instanceData = CustomScriptUtility.EncodeString(EditorJsonUtility.ToJson(m_object)); } } diff --git a/Editor/System/Model/V2/ConfigGraph.cs b/Editor/System/Model/V2/ConfigGraph.cs index bebc74a1b..ba26e8abe 100644 --- a/Editor/System/Model/V2/ConfigGraph.cs +++ b/Editor/System/Model/V2/ConfigGraph.cs @@ -74,6 +74,8 @@ public bool UseAsAssetPostprocessor get { return m_useAsAssetPostprocessor; } set { + if (m_useAsAssetPostprocessor == value) + return; m_useAsAssetPostprocessor = value; SetGraphDirty(); } @@ -95,6 +97,8 @@ public string Descrption get { return m_graphDescription; } set { + if (m_graphDescription == value) + return; m_graphDescription = value; SetGraphDirty(); } diff --git a/Editor/System/Modifiers/SetProperty.cs b/Editor/System/Modifiers/SetProperty.cs index b65fc7b47..dac508f76 100644 --- a/Editor/System/Modifiers/SetProperty.cs +++ b/Editor/System/Modifiers/SetProperty.cs @@ -329,7 +329,7 @@ private void UpdateFieldInfo () m_properties = new List (); } - var infos = m_type.GetFields (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + var infos = m_type.GetFields (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (var info in infos) { if (!info.IsPublic) { var attr = info.GetCustomAttributes (typeof(SerializeField), true); @@ -347,7 +347,7 @@ private void UpdateFieldInfo () } } - var props = m_type.GetProperties (BindingFlags.Instance); + var props = m_type.GetProperties (BindingFlags.Instance | BindingFlags.Public); foreach (var p in props) { if (!p.CanWrite) { diff --git a/Editor/System/Node/Buitin/AssetGenerator.cs b/Editor/System/Node/Buitin/AssetGenerator.cs index b1baa055a..d5fd65d09 100644 --- a/Editor/System/Node/Buitin/AssetGenerator.cs +++ b/Editor/System/Node/Buitin/AssetGenerator.cs @@ -4,13 +4,15 @@ using System.Linq; using System.IO; using System.Collections.Generic; -using V1=AssetBundleGraph; -using Model=UnityEngine.AssetGraph.DataModel.Version2; +using V1 = AssetBundleGraph; +using Model = UnityEngine.AssetGraph.DataModel.Version2; -namespace UnityEngine.AssetGraph { +namespace UnityEngine.AssetGraph +{ - [CustomNode("Create Assets/Generate Asset", 51)] - public class AssetGenerator : Node { + [CustomNode("Create Assets/Generate Asset", 51)] + public class AssetGenerator : Node + { [System.Serializable] public class GeneratorEntry @@ -19,25 +21,28 @@ public class GeneratorEntry public string m_id; public SerializableMultiTargetInstance m_instance; - public GeneratorEntry(string name, Model.ConnectionPointData point) { + public GeneratorEntry(string name, Model.ConnectionPointData point) + { m_name = name; m_id = point.Id; m_instance = new SerializableMultiTargetInstance(); } - public GeneratorEntry(string name, SerializableMultiTargetInstance i, Model.ConnectionPointData point) { + public GeneratorEntry(string name, SerializableMultiTargetInstance i, Model.ConnectionPointData point) + { m_name = name; m_id = point.Id; m_instance = new SerializableMultiTargetInstance(i); } - + public IAssetGenerator GetGenerator(BuildTarget target) { return m_instance.Get(target); } } - - public enum OutputOption : int { + + public enum OutputOption : int + { CreateInCacheDirectory, CreateInSelectedDirectory, RelativeToSourceAsset @@ -49,34 +54,41 @@ public enum OutputOption : int { [SerializeField] private SerializableMultiTargetInt m_outputOption; private GeneratorEntry m_removingEntry; - private Texture2D m_popupIcon; + private Texture2D m_popupIcon; public static readonly string kCacheDirName = "GeneratedAssets"; - public override string ActiveStyle { - get { - return "node 4 on"; - } - } - - public override string InactiveStyle { - get { - return "node 4"; - } - } - - public override string Category { - get { - return "Create"; - } - } - - public IEnumerable Generators - { - get { return m_entries; } - } - - public override void Initialize(Model.NodeData data) { + public override string ActiveStyle + { + get + { + return "node 4 on"; + } + } + + public override string InactiveStyle + { + get + { + return "node 4"; + } + } + + public override string Category + { + get + { + return "Create"; + } + } + + public IEnumerable Generators + { + get { return m_entries; } + } + + public override void Initialize(Model.NodeData data) + { m_entries = new List(); m_outputDir = new SerializableMultiTargetString(); @@ -85,9 +97,10 @@ public override void Initialize(Model.NodeData data) { data.AddDefaultInputPoint(); var point = data.AddDefaultOutputPoint(); m_defaultOutputPointId = point.Id; - } + } - public override Node Clone(Model.NodeData newData) { + public override Node Clone(Model.NodeData newData) + { var newNode = new AssetGenerator(); newData.AddDefaultInputPoint(); newData.AddDefaultOutputPoint(); @@ -98,30 +111,34 @@ public override Node Clone(Model.NodeData newData) { newNode.m_outputOption = new SerializableMultiTargetInt(m_outputOption); newNode.m_entries = new List(); - foreach(var s in m_entries) { - newNode.AddEntryForClone (newData, s); + foreach (var s in m_entries) + { + newNode.AddEntryForClone(newData, s); } - return newNode; - } + return newNode; + } private void DrawGeneratorSetting( - GeneratorEntry entry, - NodeGUI node, - AssetReferenceStreamManager streamManager, - NodeGUIEditor editor, - Action onValueChanged) + GeneratorEntry entry, + NodeGUI node, + AssetReferenceStreamManager streamManager, + NodeGUIEditor editor, + Action onValueChanged) { var generator = entry.m_instance.Get(editor.CurrentEditingGroup); - using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { + using (new EditorGUILayout.VerticalScope(GUI.skin.box)) + { using (new GUILayout.HorizontalScope()) { - var newName = EditorGUILayout.TextField ("Name", entry.m_name); - if (newName != entry.m_name) { - using(new RecordUndoScope("Change Name", node, true)) { + var newName = EditorGUILayout.TextField("Name", entry.m_name); + if (newName != entry.m_name) + { + using (new RecordUndoScope("Change Name", node, true)) + { entry.m_name = newName; - UpdateGeneratorEntry (node, entry); + UpdateGeneratorEntry(node, entry); onValueChanged(); } } @@ -132,46 +149,58 @@ private void DrawGeneratorSetting( menu.AddItem(new GUIContent("Remove Generator"), false, () => { m_removingEntry = entry; - } ); + }); menu.ShowAsContext(); } } var map = AssetGeneratorUtility.GetAttributeAssemblyQualifiedNameMap(); - if(map.Count > 0) { - using(new GUILayout.HorizontalScope()) { + if (map.Count > 0) + { + using (new GUILayout.HorizontalScope()) + { GUILayout.Label("AssetGenerator"); var guiName = AssetGeneratorUtility.GetGUIName(entry.m_instance.ClassName); - if (GUILayout.Button(guiName, "Popup", GUILayout.MinWidth(150f))) { + if (GUILayout.Button(guiName, "Popup", GUILayout.MinWidth(150f))) + { var builders = map.Keys.ToList(); - if(builders.Count > 0) { - NodeGUI.ShowTypeNamesMenu(guiName, builders, (string selectedGUIName) => + if (builders.Count > 0) + { + NodeGUI.ShowTypeNamesMenu(guiName, builders, (string selectedGUIName) => { - using(new RecordUndoScope("Change AssetGenerator class", node, true)) { + using (new RecordUndoScope("Change AssetGenerator class", node, true)) + { generator = AssetGeneratorUtility.CreateGenerator(selectedGUIName); entry.m_instance.Set(editor.CurrentEditingGroup, generator); onValueChanged(); } - } + } ); } } - MonoScript s = TypeUtility.LoadMonoScript(entry.m_instance.ClassName); + MonoScript s = entry.m_instance.MonoScript; - using(new EditorGUI.DisabledScope(s == null)) { - if(GUILayout.Button("Edit", GUILayout.Width(50))) { + using (new EditorGUI.DisabledScope(s == null)) + { + if (GUILayout.Button("Edit", GUILayout.Width(50))) + { AssetDatabase.OpenAsset(s, 0); } } } - } else { - if(!string.IsNullOrEmpty(entry.m_instance.ClassName)) { + } + else + { + if (!string.IsNullOrEmpty(entry.m_instance.ClassName)) + { EditorGUILayout.HelpBox( $"Your AssetGenerator script {entry.m_instance.ClassName} is missing from assembly. Did you delete script?", MessageType.Info); - } else { + } + else + { string[] menuNames = Model.Settings.GUI_TEXT_MENU_GENERATE_ASSETGENERATOR.Split('/'); EditorGUILayout.HelpBox( $"You need to create at least one AssetGenerator script to use this node. To start, select {menuNames[1]}>{menuNames[2]}>{menuNames[3]} menu and create new script from template.", MessageType.Info); @@ -181,20 +210,29 @@ private void DrawGeneratorSetting( GUILayout.Space(10f); editor.DrawPlatformSelector(node); - using (new EditorGUILayout.VerticalScope()) { - var disabledScope = editor.DrawOverrideTargetToggle(node, entry.m_instance.ContainsValueOf(editor.CurrentEditingGroup), (bool enabled) => { - if(enabled) { + using (new EditorGUILayout.VerticalScope()) + { + var disabledScope = editor.DrawOverrideTargetToggle(node, entry.m_instance.ContainsValueOf(editor.CurrentEditingGroup), (bool enabled) => + { + if (enabled) + { entry.m_instance.CopyDefaultValueTo(editor.CurrentEditingGroup); - } else { + } + else + { entry.m_instance.Remove(editor.CurrentEditingGroup); } onValueChanged(); }); - using (disabledScope) { - if (generator != null) { - Action onChangedAction = () => { - using(new RecordUndoScope("Change AssetGenerator Setting", node)) { + using (disabledScope) + { + if (generator != null) + { + Action onChangedAction = () => + { + using (new RecordUndoScope("Change AssetGenerator Setting", node)) + { entry.m_instance.Set(editor.CurrentEditingGroup, generator); onValueChanged(); } @@ -207,116 +245,145 @@ private void DrawGeneratorSetting( } } - public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager streamManager, NodeGUIEditor editor, Action onValueChanged) { + public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager streamManager, NodeGUIEditor editor, Action onValueChanged) + { - EditorGUILayout.HelpBox("Generate Asset: Generate new asset from incoming asset.", MessageType.Info); - editor.UpdateNodeName(node); + EditorGUILayout.HelpBox("Generate Asset: Generate new asset from incoming asset.", MessageType.Info); + editor.UpdateNodeName(node); GUILayout.Space(8f); - if (m_popupIcon == null) - { - m_popupIcon = EditorGUIUtility.Load (EditorGUIUtility.isProSkin ? "icons/d__Popup.png" : "icons/_Popup.png") as Texture2D; - } + if (m_popupIcon == null) + { + m_popupIcon = EditorGUIUtility.Load(EditorGUIUtility.isProSkin ? "icons/d__Popup.png" : "icons/_Popup.png") as Texture2D; + } editor.DrawPlatformSelector(node); - using (new EditorGUILayout.VerticalScope()) { - var disabledScope = editor.DrawOverrideTargetToggle(node, m_outputOption.ContainsValueOf(editor.CurrentEditingGroup), (bool enabled) => { - if(enabled) { + using (new EditorGUILayout.VerticalScope()) + { + var disabledScope = editor.DrawOverrideTargetToggle(node, m_outputOption.ContainsValueOf(editor.CurrentEditingGroup), (bool enabled) => + { + if (enabled) + { m_outputOption[editor.CurrentEditingGroup] = m_outputOption.DefaultValue; m_outputDir[editor.CurrentEditingGroup] = m_outputDir.DefaultValue; - } else { + } + else + { m_outputOption.Remove(editor.CurrentEditingGroup); m_outputDir.Remove(editor.CurrentEditingGroup); } onValueChanged(); }); - using (disabledScope) { + using (disabledScope) + { OutputOption opt = (OutputOption)m_outputOption[editor.CurrentEditingGroup]; var newOption = (OutputOption)EditorGUILayout.EnumPopup("Output Option", opt); - if(newOption != opt) { - using(new RecordUndoScope("Change Output Option", node, true)){ + if (newOption != opt) + { + using (new RecordUndoScope("Change Output Option", node, true)) + { m_outputOption[editor.CurrentEditingGroup] = (int)newOption; onValueChanged(); } opt = newOption; } - if (opt != OutputOption.CreateInCacheDirectory) { - EditorGUILayout.HelpBox ("When you are not creating assets under cache directory, make sure your generators are not overwriting assets each other.", MessageType.Info); + if (opt != OutputOption.CreateInCacheDirectory) + { + EditorGUILayout.HelpBox("When you are not creating assets under cache directory, make sure your generators are not overwriting assets each other.", MessageType.Info); } - using (new EditorGUI.DisabledScope (opt == OutputOption.CreateInCacheDirectory)) { + using (new EditorGUI.DisabledScope(opt == OutputOption.CreateInCacheDirectory)) + { var newDirPath = m_outputDir[editor.CurrentEditingGroup]; - if (opt == OutputOption.CreateInSelectedDirectory) { - newDirPath = editor.DrawFolderSelector ("Output Directory", "Select Output Folder", - m_outputDir [editor.CurrentEditingGroup], + if (opt == OutputOption.CreateInSelectedDirectory) + { + newDirPath = editor.DrawFolderSelector("Output Directory", "Select Output Folder", + m_outputDir[editor.CurrentEditingGroup], Application.dataPath, - (string folderSelected) => { + (string folderSelected) => + { string basePath = Application.dataPath; - if (basePath == folderSelected) { + if (basePath == folderSelected) + { folderSelected = string.Empty; - } else { - var index = folderSelected.IndexOf (basePath); - if (index >= 0) { - folderSelected = folderSelected.Substring (basePath.Length + index); - if (folderSelected.IndexOf ('/') == 0) { - folderSelected = folderSelected.Substring (1); + } + else + { + var index = folderSelected.IndexOf(basePath); + if (index >= 0) + { + folderSelected = folderSelected.Substring(basePath.Length + index); + if (folderSelected.IndexOf('/') == 0) + { + folderSelected = folderSelected.Substring(1); } } } return folderSelected; } ); - } else if (opt == OutputOption.RelativeToSourceAsset) { + } + else if (opt == OutputOption.RelativeToSourceAsset) + { newDirPath = EditorGUILayout.TextField("Relative Path", m_outputDir[editor.CurrentEditingGroup]); } - if (newDirPath != m_outputDir[editor.CurrentEditingGroup]) { - using(new RecordUndoScope("Change Output Directory", node, true)){ + if (newDirPath != m_outputDir[editor.CurrentEditingGroup]) + { + using (new RecordUndoScope("Change Output Directory", node, true)) + { m_outputDir[editor.CurrentEditingGroup] = newDirPath; onValueChanged(); } } - var dirPath = Path.Combine (Application.dataPath, m_outputDir [editor.CurrentEditingGroup]); + var dirPath = Path.Combine(Application.dataPath, m_outputDir[editor.CurrentEditingGroup]); - if (opt == OutputOption.CreateInSelectedDirectory && - !string.IsNullOrEmpty(m_outputDir [editor.CurrentEditingGroup]) && - !Directory.Exists (dirPath)) + if (opt == OutputOption.CreateInSelectedDirectory && + !string.IsNullOrEmpty(m_outputDir[editor.CurrentEditingGroup]) && + !Directory.Exists(dirPath)) { - using (new EditorGUILayout.HorizontalScope()) { + using (new EditorGUILayout.HorizontalScope()) + { EditorGUILayout.LabelField(m_outputDir[editor.CurrentEditingGroup] + " does not exist."); - if(GUILayout.Button("Create directory")) { + if (GUILayout.Button("Create directory")) + { Directory.CreateDirectory(dirPath); - AssetDatabase.Refresh (); + AssetDatabase.Refresh(); } } EditorGUILayout.Space(); string parentDir = Path.GetDirectoryName(m_outputDir[editor.CurrentEditingGroup]); - if(Directory.Exists(parentDir)) { + if (Directory.Exists(parentDir)) + { EditorGUILayout.LabelField("Available Directories:"); string[] dirs = Directory.GetDirectories(parentDir); - foreach(string s in dirs) { + foreach (string s in dirs) + { EditorGUILayout.LabelField(s); } } EditorGUILayout.Space(); } - if (opt == OutputOption.CreateInSelectedDirectory || opt == OutputOption.CreateInCacheDirectory) { - var outputDir = PrepareOutputDirectory (BuildTargetUtility.GroupToTarget(editor.CurrentEditingGroup), node.Data, null); + if (opt == OutputOption.CreateInSelectedDirectory || opt == OutputOption.CreateInCacheDirectory) + { + var outputDir = PrepareOutputDirectory(BuildTargetUtility.GroupToTarget(editor.CurrentEditingGroup), node.Data, null); - using (new EditorGUI.DisabledScope (!Directory.Exists (outputDir))) + using (new EditorGUI.DisabledScope(!Directory.Exists(outputDir))) { - using (new EditorGUILayout.HorizontalScope ()) { - GUILayout.FlexibleSpace (); - if (GUILayout.Button ("Highlight in Project Window", GUILayout.Width (180f))) { - var folder = AssetDatabase.LoadMainAssetAtPath (outputDir); - EditorGUIUtility.PingObject (folder); + using (new EditorGUILayout.HorizontalScope()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Highlight in Project Window", GUILayout.Width(180f))) + { + var folder = AssetDatabase.LoadMainAssetAtPath(outputDir); + EditorGUIUtility.PingObject(folder); } } } @@ -327,179 +394,223 @@ public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager st GUILayout.Space(8f); - foreach (var s in m_entries) { - DrawGeneratorSetting (s, node, streamManager, editor, onValueChanged); - GUILayout.Space (10f); + foreach (var s in m_entries) + { + DrawGeneratorSetting(s, node, streamManager, editor, onValueChanged); + GUILayout.Space(10f); } - if (m_removingEntry != null) { - using (new RecordUndoScope ("Remove Generator", node)) { - RemoveGeneratorEntry (node, m_removingEntry); + if (m_removingEntry != null) + { + using (new RecordUndoScope("Remove Generator", node)) + { + RemoveGeneratorEntry(node, m_removingEntry); m_removingEntry = null; - onValueChanged (); + onValueChanged(); } } - GUILayout.Space (8); + GUILayout.Space(8); - if (GUILayout.Button ("Add Generator")) { - using (new RecordUndoScope ("Add Generator", node)) { - AddEntry (node); - onValueChanged (); + if (GUILayout.Button("Add Generator")) + { + using (new RecordUndoScope("Add Generator", node)) + { + AddEntry(node); + onValueChanged(); } } - } + } - public override void OnContextMenuGUI(GenericMenu menu) { - foreach (var s in m_entries) { - MonoScript script = TypeUtility.LoadMonoScript(s.m_instance.ClassName); - if(script != null) { + public override void OnContextMenuGUI(GenericMenu menu) + { + foreach (var s in m_entries) + { + MonoScript script = s.m_instance.MonoScript; + if (script != null) + { menu.AddItem( new GUIContent($"Edit Script({script.name})"), - false, - () => { + false, + () => + { AssetDatabase.OpenAsset(script, 0); } ); } } - } + } - public override void Prepare (BuildTarget target, - Model.NodeData node, - IEnumerable incoming, - IEnumerable connectionsToOutput, - PerformGraph.Output Output) - { + public override void Prepare(BuildTarget target, + Model.NodeData node, + IEnumerable incoming, + IEnumerable connectionsToOutput, + PerformGraph.Output Output) + { ValidateAssetGenerator(node, target, incoming, - () => { + () => + { throw new NodeException("AssetGenerator is not specified.", "Select generator from inspector.", node); }, - () => { + () => + { throw new NodeException("Failed to create AssetGenerator from settings.", "Fix AssetGenerator settings from inspector", node); }, - (AssetReference badAsset) => { - throw new NodeException($"Generator not create asset from source : Source: {badAsset.importFrom}", + (AssetReference badAsset) => + { + throw new NodeException($"Generator not create asset from source : Source: {badAsset.importFrom}", "Remove source asset from node input.", node); }, - (AssetReference badAsset) => { - throw new NodeException($"Can not import incoming asset {badAsset.fileNameAndExtension}.", + (AssetReference badAsset) => + { + throw new NodeException($"Can not import incoming asset {badAsset.fileNameAndExtension}.", "Remove source asset from node input.", node); } ); - if(incoming == null) { - return; - } + if (incoming == null) + { + return; + } - if(connectionsToOutput == null || Output == null) { + if (connectionsToOutput == null || Output == null) + { return; } var allOutput = new Dictionary>>(); - foreach(var outPoints in node.OutputPoints) { + foreach (var outPoints in node.OutputPoints) + { allOutput[outPoints.Id] = new Dictionary>(); } - var defaultOutputCond = connectionsToOutput.Where (c => c.FromNodeConnectionPointId == m_defaultOutputPointId); + var defaultOutputCond = connectionsToOutput.Where(c => c.FromNodeConnectionPointId == m_defaultOutputPointId); Model.ConnectionData defaultOutput = null; - if (defaultOutputCond.Any ()) { - defaultOutput = defaultOutputCond.First (); + if (defaultOutputCond.Any()) + { + defaultOutput = defaultOutputCond.First(); } - foreach(var ag in incoming) { - if (defaultOutput != null) { + foreach (var ag in incoming) + { + if (defaultOutput != null) + { Output(defaultOutput, ag.assetGroups); } - foreach(var groupKey in ag.assetGroups.Keys) { - foreach(var a in ag.assetGroups [groupKey]) { - foreach (var entry in m_entries) { + foreach (var groupKey in ag.assetGroups.Keys) + { + foreach (var a in ag.assetGroups[groupKey]) + { + foreach (var entry in m_entries) + { var assetOutputDir = PrepareOutputDirectory(target, node, a); var generator = entry.m_instance.Get(target); UnityEngine.Assertions.Assert.IsNotNull(generator); - var newItem = FileUtility.PathCombine (assetOutputDir, GetGeneratorIdForSubPath(target, entry), a.fileName + generator.GetAssetExtension (a)); + var newItem = FileUtility.PathCombine(assetOutputDir, GetGeneratorIdForSubPath(target, entry), a.fileName + generator.GetAssetExtension(a)); var output = allOutput[entry.m_id]; - if(!output.ContainsKey(groupKey)) { + if (!output.ContainsKey(groupKey)) + { output[groupKey] = new List(); } - output[groupKey].Add(AssetReferenceDatabase.GetReferenceWithType (newItem, generator.GetAssetType(a))); + output[groupKey].Add(AssetReferenceDatabase.GetReferenceWithType(newItem, generator.GetAssetType(a))); } } - } - } + } + } - foreach(var dst in connectionsToOutput) { - if(allOutput.ContainsKey(dst.FromNodeConnectionPointId)) { + foreach (var dst in connectionsToOutput) + { + if (allOutput.ContainsKey(dst.FromNodeConnectionPointId)) + { Output(dst, allOutput[dst.FromNodeConnectionPointId]); } } - } - - public override void Build (BuildTarget target, - Model.NodeData node, - IEnumerable incoming, - IEnumerable connectionsToOutput, - PerformGraph.Output Output, - Action progressFunc) - { - if(incoming == null) { - return; - } + } - bool isAnyAssetGenerated = false; + public override void Build(BuildTarget target, + Model.NodeData node, + IEnumerable incoming, + IEnumerable connectionsToOutput, + PerformGraph.Output Output, + Action progressFunc) + { + if (incoming == null) + { + return; + } - foreach (var entry in m_entries) { - var generator = entry.m_instance.Get(target); - UnityEngine.Assertions.Assert.IsNotNull(generator); + bool isAnyAssetGenerated = false; - foreach(var ag in incoming) { - foreach(var assets in ag.assetGroups.Values) { - foreach (var a in assets) { - var assetOutputDir = PrepareOutputDirectory (target, node, a); - var assetSaveDir = FileUtility.PathCombine (assetOutputDir, GetGeneratorIdForSubPath(target, entry)); - var assetSavePath = FileUtility.PathCombine (assetSaveDir, a.fileName + generator.GetAssetExtension(a)); + try + { + AssetDatabase.StartAssetEditing(); + foreach (var entry in m_entries) + { + var generator = entry.m_instance.Get(target); + UnityEngine.Assertions.Assert.IsNotNull(generator); - if(!File.Exists(assetSavePath) || AssetGenerateInfo.DoesAssetNeedRegenerate(entry, node, target, a)) + foreach (var ag in incoming) + { + foreach (var assets in ag.assetGroups.Values) + { + foreach (var a in assets) { - if (!Directory.Exists (assetSaveDir)) { - Directory.CreateDirectory (assetSaveDir); - } + var assetOutputDir = PrepareOutputDirectory(target, node, a); + var assetSaveDir = FileUtility.PathCombine(assetOutputDir, GetGeneratorIdForSubPath(target, entry)); + var assetSavePath = FileUtility.PathCombine(assetSaveDir, a.fileName + generator.GetAssetExtension(a)); - if (!generator.GenerateAsset (a, assetSavePath)) { - throw new AssetGraphException( - $"{node.Name} :Failed to generate asset for {entry.m_name}"); - } - if (!File.Exists (assetSavePath)) { - throw new AssetGraphException( - $"{node.Name} :{entry.m_name} returned success, but generated asset not found."); - } + if (!File.Exists(assetSavePath) || AssetGenerateInfo.DoesAssetNeedRegenerate(entry, node, target, a)) + { + if (!Directory.Exists(assetSaveDir)) + { + Directory.CreateDirectory(assetSaveDir); + } + + if (!generator.GenerateAsset(a, assetSavePath)) + { + throw new AssetGraphException( + $"{node.Name} :Failed to generate asset for {entry.m_name}"); + } + if (!File.Exists(assetSavePath)) + { + throw new AssetGraphException( + $"{node.Name} :{entry.m_name} returned success, but generated asset not found."); + } - AssetProcessEventRecord.GetRecord ().LogModify (AssetDatabase.AssetPathToGUID(assetSavePath)); + AssetProcessEventRecord.GetRecord().LogModify(AssetDatabase.AssetPathToGUID(assetSavePath)); - isAnyAssetGenerated = true; + isAnyAssetGenerated = true; - LogUtility.Logger.LogFormat(LogType.Log, "{0} is (re)generating Asset:{1} with {2}({3})", node.Name, assetSavePath, - AssetGeneratorUtility.GetGUIName(entry.m_instance.ClassName), - AssetGeneratorUtility.GetVersion(entry.m_instance.ClassName)); + LogUtility.Logger.LogFormat(LogType.Log, "{0} is (re)generating Asset:{1} with {2}({3})", node.Name, assetSavePath, + AssetGeneratorUtility.GetGUIName(entry.m_instance.ClassName), + AssetGeneratorUtility.GetVersion(entry.m_instance.ClassName)); - if(progressFunc != null) progressFunc(node, $"Creating {assetSavePath}", 0.5f); + if (progressFunc != null) progressFunc(node, $"Creating {assetSavePath}", 0.5f); - AssetGenerateInfo.SaveAssetGenerateInfo(entry, node, target, a); + AssetGenerateInfo.SaveAssetGenerateInfo(entry, node, target, a); + } } } } } } + finally + { + AssetDatabase.StopAssetEditing(); + } - if (isAnyAssetGenerated) { - AssetDatabase.Refresh (); + if (isAnyAssetGenerated) + { + AssetDatabase.Refresh(); + AssetDatabase.SaveAssets(); } - } + } - public void AddEntry(NodeGUI node) { + public void AddEntry(NodeGUI node) + { var point = node.Data.AddOutputPoint(""); var newEntry = new GeneratorEntry("", point); m_entries.Add(newEntry); @@ -507,95 +618,115 @@ public void AddEntry(NodeGUI node) { } // For Clone - public void AddEntryForClone(Model.NodeData data, GeneratorEntry src) { + public void AddEntryForClone(Model.NodeData data, GeneratorEntry src) + { var point = data.AddOutputPoint(src.m_name); var newEntry = new GeneratorEntry(src.m_name, src.m_instance, point); m_entries.Add(newEntry); UpdateGeneratorEntry(null, data, newEntry); } - public void RemoveGeneratorEntry(NodeGUI node, GeneratorEntry e) { + public void RemoveGeneratorEntry(NodeGUI node, GeneratorEntry e) + { m_entries.Remove(e); - var point = GetConnectionPoint (node.Data, e); + var point = GetConnectionPoint(node.Data, e); node.Data.OutputPoints.Remove(point); // event must raise to remove connection associated with point NodeGUIUtility.NodeEventHandler(new NodeEvent(NodeEvent.EventType.EVENT_CONNECTIONPOINT_DELETED, node, Vector2.zero, point)); } - public Model.ConnectionPointData GetConnectionPoint(Model.NodeData n, GeneratorEntry e) { + public Model.ConnectionPointData GetConnectionPoint(Model.NodeData n, GeneratorEntry e) + { Model.ConnectionPointData p = n.OutputPoints.Find(v => v.Id == e.m_id); UnityEngine.Assertions.Assert.IsNotNull(p); return p; } - public void UpdateGeneratorEntry(NodeGUI node, GeneratorEntry e) { - UpdateGeneratorEntry (node, node.Data, e); + public void UpdateGeneratorEntry(NodeGUI node, GeneratorEntry e) + { + UpdateGeneratorEntry(node, node.Data, e); } - public void UpdateGeneratorEntry(NodeGUI node, Model.NodeData data, GeneratorEntry e) { + public void UpdateGeneratorEntry(NodeGUI node, Model.NodeData data, GeneratorEntry e) + { Model.ConnectionPointData p = node.Data.OutputPoints.Find(v => v.Id == e.m_id); UnityEngine.Assertions.Assert.IsNotNull(p); p.Label = e.m_name; - if (node != null) { + if (node != null) + { // event must raise to propagate change to connection associated with point NodeGUIUtility.NodeEventHandler(new NodeEvent(NodeEvent.EventType.EVENT_CONNECTIONPOINT_LABELCHANGED, node, Vector2.zero, GetConnectionPoint(node.Data, e))); } } - private string GetGeneratorIdForSubPath(BuildTarget target, GeneratorEntry e) { - var outputOption = (OutputOption)m_outputOption [target]; - if(outputOption == OutputOption.CreateInCacheDirectory) { + private string GetGeneratorIdForSubPath(BuildTarget target, GeneratorEntry e) + { + var outputOption = (OutputOption)m_outputOption[target]; + if (outputOption == OutputOption.CreateInCacheDirectory) + { return e.m_id; } return string.Empty; } - private string PrepareOutputDirectory(BuildTarget target, Model.NodeData node, AssetReference a) { + private string PrepareOutputDirectory(BuildTarget target, Model.NodeData node, AssetReference a) + { - var outputOption = (OutputOption)m_outputOption [target]; + var outputOption = (OutputOption)m_outputOption[target]; - if (outputOption == OutputOption.CreateInSelectedDirectory) { - return Path.Combine("Assets", m_outputDir [target]); + if (outputOption == OutputOption.CreateInSelectedDirectory) + { + return Path.Combine("Assets", m_outputDir[target]); } - if(outputOption == OutputOption.CreateInCacheDirectory) { - return FileUtility.EnsureCacheDirExists (target, node, kCacheDirName); + if (outputOption == OutputOption.CreateInCacheDirectory) + { + return FileUtility.EnsureCacheDirExists(target, node, kCacheDirName); } - var sourceDir = Path.GetDirectoryName (a.importFrom); + var sourceDir = Path.GetDirectoryName(a.importFrom); - return FileUtility.PathCombine (sourceDir, m_outputDir [target]); + return FileUtility.PathCombine(sourceDir, m_outputDir[target]); } - public void ValidateAssetGenerator ( - Model.NodeData node, - BuildTarget target, - IEnumerable incoming, + public void ValidateAssetGenerator( + Model.NodeData node, + BuildTarget target, + IEnumerable incoming, Action noGeneratorData, - Action failedToCreateGenerator, + Action failedToCreateGenerator, Action canNotGenerateAsset, - Action canNotImportAsset - ) { - foreach (var entry in m_entries) { + Action canNotImportAsset + ) + { + foreach (var entry in m_entries) + { var generator = entry.m_instance.Get(target); - if(null == generator ) { + if (null == generator) + { failedToCreateGenerator(); } - generator.OnValidate (); + generator.OnValidate(); - if(null != generator && null != incoming) { - foreach(var ag in incoming) { - foreach(var assets in ag.assetGroups.Values) { - foreach (var a in assets) { - if(string.IsNullOrEmpty(a.importFrom)) { + if (null != generator && null != incoming) + { + foreach (var ag in incoming) + { + foreach (var assets in ag.assetGroups.Values) + { + foreach (var a in assets) + { + if (string.IsNullOrEmpty(a.importFrom)) + { canNotImportAsset(a); continue; } - if(!generator.CanGenerateAsset(a)) { + if (!generator.CanGenerateAsset(a)) + { canNotGenerateAsset(a); } } @@ -603,6 +734,6 @@ Action canNotImportAsset } } } - } - } + } + } } \ No newline at end of file diff --git a/Editor/System/Node/Buitin/ImportSetting.cs b/Editor/System/Node/Buitin/ImportSetting.cs index 86cd94981..e772da435 100644 --- a/Editor/System/Node/Buitin/ImportSetting.cs +++ b/Editor/System/Node/Buitin/ImportSetting.cs @@ -5,15 +5,17 @@ using System.IO; using System.Collections.Generic; -using V1=AssetBundleGraph; -using Model=UnityEngine.AssetGraph.DataModel.Version2; +using V1 = AssetBundleGraph; +using Model = UnityEngine.AssetGraph.DataModel.Version2; -namespace UnityEngine.AssetGraph { - - [CustomNode("Modify Assets/Overwrite Import Settings", 60)] - public class ImportSetting : Node, Model.NodeDataImporter { +namespace UnityEngine.AssetGraph +{ - [SerializeField] private SerializableMultiTargetString m_spritePackingTagNameTemplate; // legacy + [CustomNode("Modify Assets/Overwrite Import Settings", 60)] + public class ImportSetting : Node, Model.NodeDataImporter + { + + [SerializeField] private SerializableMultiTargetString m_spritePackingTagNameTemplate; // legacy [SerializeField] private bool m_overwritePackingTag; // legacy [SerializeField] private bool m_useCustomSettingAsset; // legacy [SerializeField] private bool m_overwriteSpriteSheet; // legacy @@ -24,202 +26,244 @@ public class ImportSetting : Node, Model.NodeDataImporter { private UnityEngine.Object m_customSettingAssetObject; private Editor m_importerEditor; - public override string ActiveStyle { - get { - return "node 8 on"; - } - } - - public override string InactiveStyle { - get { - return "node 8"; - } - } - - public override string Category { - get { - return "Modify"; - } - } - - private UnityEngine.Object CustomSettingAsset { - get { - if (m_customSettingAssetObject == null) { - if (!string.IsNullOrEmpty (m_customSettingAssetGuid)) { - var path = AssetDatabase.GUIDToAssetPath (m_customSettingAssetGuid); - if (!string.IsNullOrEmpty (path)) { - m_customSettingAssetObject = AssetDatabase.LoadMainAssetAtPath (path); + public override string ActiveStyle + { + get + { + return "node 8 on"; + } + } + + public override string InactiveStyle + { + get + { + return "node 8"; + } + } + + public override string Category + { + get + { + return "Modify"; + } + } + + private UnityEngine.Object CustomSettingAsset + { + get + { + if (m_customSettingAssetObject == null) + { + if (!string.IsNullOrEmpty(m_customSettingAssetGuid)) + { + var path = AssetDatabase.GUIDToAssetPath(m_customSettingAssetGuid); + if (!string.IsNullOrEmpty(path)) + { + m_customSettingAssetObject = AssetDatabase.LoadMainAssetAtPath(path); } } } return m_customSettingAssetObject; } - set { + set + { m_customSettingAssetObject = value; - if (value != null) { - var path = AssetDatabase.GetAssetPath (value); - m_customSettingAssetGuid = AssetDatabase.AssetPathToGUID (path); - } else { + if (value != null) + { + var path = AssetDatabase.GetAssetPath(value); + m_customSettingAssetGuid = AssetDatabase.AssetPathToGUID(path); + } + else + { m_customSettingAssetGuid = string.Empty; } - if (m_importerEditor != null) { - UnityEngine.Object.DestroyImmediate (m_importerEditor); + if (m_importerEditor != null) + { + UnityEngine.Object.DestroyImmediate(m_importerEditor); m_importerEditor = null; } } } - private string CustomSettingAssetGuid { - get { + private string CustomSettingAssetGuid + { + get + { return m_customSettingAssetGuid; } - set { + set + { m_customSettingAssetGuid = value; m_customSettingAssetObject = null; - if (m_importerEditor != null) { - UnityEngine.Object.DestroyImmediate (m_importerEditor); + if (m_importerEditor != null) + { + UnityEngine.Object.DestroyImmediate(m_importerEditor); m_importerEditor = null; } } } - public override void Initialize(Model.NodeData data) { - m_spritePackingTagNameTemplate = new SerializableMultiTargetString("*"); - m_overwritePackingTag = false; + public override void Initialize(Model.NodeData data) + { + m_spritePackingTagNameTemplate = new SerializableMultiTargetString("*"); + m_overwritePackingTag = false; m_useCustomSettingAsset = false; m_customSettingAssetGuid = string.Empty; m_overwriteSpriteSheet = false; m_referenceAssetGuid = string.Empty; - m_configuratorInstance = new SerializableMultiTargetInstance (); + m_configuratorInstance = new SerializableMultiTargetInstance(); - data.AddDefaultInputPoint(); - data.AddDefaultOutputPoint(); - } + data.AddDefaultInputPoint(); + data.AddDefaultOutputPoint(); + } - public void Import(V1.NodeData v1, Model.NodeData v2) { - // do nothing - } + public void Import(V1.NodeData v1, Model.NodeData v2) + { + // do nothing + } - public override Node Clone(Model.NodeData newData) { - var newNode = new ImportSetting(); + public override Node Clone(Model.NodeData newData) + { + var newNode = new ImportSetting(); newNode.m_overwritePackingTag = m_overwritePackingTag; newNode.m_spritePackingTagNameTemplate = new SerializableMultiTargetString(m_spritePackingTagNameTemplate); newNode.m_useCustomSettingAsset = m_useCustomSettingAsset; newNode.m_customSettingAssetGuid = m_customSettingAssetGuid; newNode.m_overwriteSpriteSheet = m_overwriteSpriteSheet; - newNode.m_configuratorInstance = new SerializableMultiTargetInstance (m_configuratorInstance); + newNode.m_configuratorInstance = new SerializableMultiTargetInstance(m_configuratorInstance); newNode.m_referenceAssetGuid = string.Empty; - newData.AddDefaultInputPoint(); - newData.AddDefaultOutputPoint(); - return newNode; - } + newData.AddDefaultInputPoint(); + newData.AddDefaultOutputPoint(); + return newNode; + } - public override bool OnAssetsReimported( - Model.NodeData nodeData, - AssetReferenceStreamManager streamManager, - BuildTarget target, + public override bool OnAssetsReimported( + Model.NodeData nodeData, + AssetReferenceStreamManager streamManager, + BuildTarget target, AssetPostprocessorContext ctx, bool isBuilding) - { + { var samplingDirectoryPath = FileUtility.PathCombine(Model.Settings.Path.SavedSettingsPath, "ImportSettings", nodeData.Id); - foreach(var importedAsset in ctx.ImportedAssets) { - if(importedAsset.importFrom.StartsWith(samplingDirectoryPath)) { - return true; - } + foreach (var importedAsset in ctx.ImportedAssets) + { + if (importedAsset.importFrom.StartsWith(samplingDirectoryPath)) + { + return true; + } // Test this later -// if (m_customSettingAssetGuid != null) { -// if(imported.StartsWith(AssetDatabase.GUIDToAssetPath(m_customSettingAssetGuid))) { -// return true; -// } -// } - } + // if (m_customSettingAssetGuid != null) { + // if(imported.StartsWith(AssetDatabase.GUIDToAssetPath(m_customSettingAssetGuid))) { + // return true; + // } + // } + } - return false; - } + return false; + } - public override void OnNodeDelete(Model.NodeData nodeData) { + public override void OnNodeDelete(Model.NodeData nodeData) + { var savedSettingDir = FileUtility.PathCombine(Model.Settings.Path.SavedSettingsPath, "ImportSettings", nodeData.Id); - if (AssetDatabase.IsValidFolder (savedSettingDir)) { - FileUtility.DeleteDirectory (savedSettingDir, true); + if (AssetDatabase.IsValidFolder(savedSettingDir)) + { + FileUtility.DeleteDirectory(savedSettingDir, true); } } - public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager streamManager, NodeGUIEditor editor, Action onValueChanged) { + public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager streamManager, NodeGUIEditor editor, Action onValueChanged) + { - EditorGUILayout.HelpBox("Overwrite Import Setting: Overwrite import settings of incoming assets.", MessageType.Info); - editor.UpdateNodeName(node); + EditorGUILayout.HelpBox("Overwrite Import Setting: Overwrite import settings of incoming assets.", MessageType.Info); + editor.UpdateNodeName(node); // prevent inspector flicking by new Editor changing active selction - node.SetActive (true); + node.SetActive(true); - using (new EditorGUILayout.VerticalScope()) { + using (new EditorGUILayout.VerticalScope()) + { Type importerType = null; Type assetType = null; - var referenceImporter = GetReferenceAssetImporter (node.Data, false); - if (referenceImporter != null) { - importerType = referenceImporter.GetType (); - assetType = TypeUtility.GetMainAssetTypeAtPath (AssetDatabase.GUIDToAssetPath (m_referenceAssetGuid)); - } else { + var referenceImporter = GetReferenceAssetImporter(node.Data, false); + if (referenceImporter != null) + { + importerType = referenceImporter.GetType(); + assetType = TypeUtility.GetMainAssetTypeAtPath(AssetDatabase.GUIDToAssetPath(m_referenceAssetGuid)); + } + else + { GUILayout.Space(10f); - using (new EditorGUILayout.VerticalScope (GUI.skin.box)) { - EditorGUILayout.HelpBox ("Import setting type can be set by incoming asset, or you can specify by selecting.", MessageType.Info); - using (new EditorGUILayout.HorizontalScope ()) { - EditorGUILayout.LabelField ("Importer Type"); - if (GUILayout.Button ("", "Popup", GUILayout.MinWidth (150f))) { + using (new EditorGUILayout.VerticalScope(GUI.skin.box)) + { + EditorGUILayout.HelpBox("Import setting type can be set by incoming asset, or you can specify by selecting.", MessageType.Info); + using (new EditorGUILayout.HorizontalScope()) + { + EditorGUILayout.LabelField("Importer Type"); + if (GUILayout.Button("", "Popup", GUILayout.MinWidth(150f))) + { - var menu = new GenericMenu (); + var menu = new GenericMenu(); - var guiMap = ImporterConfiguratorUtility.GetImporterConfiguratorGuiNameTypeMap (); - var guiNames = guiMap.Keys.ToArray (); + var guiMap = ImporterConfiguratorUtility.GetImporterConfiguratorGuiNameTypeMap(); + var guiNames = guiMap.Keys.ToArray(); - for (var i = 0; i < guiNames.Length; i++) { + for (var i = 0; i < guiNames.Length; i++) + { var index = i; - menu.AddItem ( - new GUIContent (guiNames [i]), + menu.AddItem( + new GUIContent(guiNames[i]), false, - () => { - ResetConfig (node.Data); - CreateConfigurator (node.Data, guiMap [guiNames [index]]); + () => + { + ResetConfig(node.Data); + CreateConfigurator(node.Data, guiMap[guiNames[index]]); onValueChanged(); // call Validate NodeGUIUtility.NodeEventHandler(new NodeEvent(NodeEvent.EventType.EVENT_NODE_UPDATED, node)); } ); } - menu.ShowAsContext (); + menu.ShowAsContext(); } } } return; } - if (importerType != null && assetType != null) { - GUILayout.Space (10f); - DoCustomAssetGUI (assetType, importerType, node, editor, onValueChanged); + if (importerType != null && assetType != null) + { + GUILayout.Space(10f); + DoCustomAssetGUI(assetType, importerType, node, editor, onValueChanged); } // get reference importer again (enabling custom asset this time) - referenceImporter = GetReferenceAssetImporter (node.Data, true); + referenceImporter = GetReferenceAssetImporter(node.Data, true); - if (referenceImporter != null) { - var configurator = m_configuratorInstance.Get (editor.CurrentEditingGroup); - if (configurator != null) { - GUILayout.Space (10f); + if (referenceImporter != null) + { + var configurator = m_configuratorInstance.Get(editor.CurrentEditingGroup); + if (configurator != null) + { + GUILayout.Space(10f); - Action onChangedAction = () => { - using(new RecordUndoScope($"Change {node.Name} Setting", node)) { + Action onChangedAction = () => + { + using (new RecordUndoScope($"Change {node.Name} Setting", node)) + { m_configuratorInstance.Set(editor.CurrentEditingGroup, configurator); onValueChanged(); } }; - configurator.OnInspectorGUI (referenceImporter, editor.CurrentEditingGroup, onChangedAction); + configurator.OnInspectorGUI(referenceImporter, editor.CurrentEditingGroup, onChangedAction); } if (m_importerEditor == null) @@ -228,247 +272,290 @@ public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager st } } - if (m_importerEditor != null) { - GUILayout.Space (10f); - GUILayout.Label ($"Import Setting ({importerType.Name})"); + if (m_importerEditor != null) + { + GUILayout.Space(10f); + GUILayout.Label($"Import Setting ({importerType.Name})"); GUI.changed = false; - m_importerEditor.OnInspectorGUI (); + m_importerEditor.OnInspectorGUI(); if (GUI.changed) { referenceImporter.SaveAndReimport(); } } - GUILayout.Space (40f); - using (new EditorGUILayout.HorizontalScope (GUI.skin.box)) { - GUILayout.Space (4f); - EditorGUILayout.LabelField ("Clear Saved Import Setting"); + GUILayout.Space(40f); + using (new EditorGUILayout.HorizontalScope(GUI.skin.box)) + { + GUILayout.Space(4f); + EditorGUILayout.LabelField("Clear Saved Import Setting"); - if (GUILayout.Button ("Clear")) { - if (EditorUtility.DisplayDialog ("Clear Saved Import Setting", - $"Do you want to reset saved import setting for \"{node.Name}\"? This operation is not undoable.", "OK", "Cancel")) { - ResetConfig (node.Data); + if (GUILayout.Button("Clear")) + { + if (EditorUtility.DisplayDialog("Clear Saved Import Setting", + $"Do you want to reset saved import setting for \"{node.Name}\"? This operation is not undoable.", "OK", "Cancel")) + { + ResetConfig(node.Data); onValueChanged(); } } } - } - } + } + } - private void DoCustomAssetGUI(Type assetType, Type importerType, NodeGUI node, NodeGUIEditor editor, Action onValueChanged) { + private void DoCustomAssetGUI(Type assetType, Type importerType, NodeGUI node, NodeGUIEditor editor, Action onValueChanged) + { // Custom Settings Asset - using (new EditorGUILayout.VerticalScope (GUI.skin.box)) { + using (new EditorGUILayout.VerticalScope(GUI.skin.box)) + { - var newUseCustomAsset = EditorGUILayout.ToggleLeft ("Use Custom Setting Asset", m_useCustomSettingAsset); - if (newUseCustomAsset != m_useCustomSettingAsset) { - using (new RecordUndoScope ("Change Custom Setting Asset", node, true)) { + var newUseCustomAsset = EditorGUILayout.ToggleLeft("Use Custom Setting Asset", m_useCustomSettingAsset); + if (newUseCustomAsset != m_useCustomSettingAsset) + { + using (new RecordUndoScope("Change Custom Setting Asset", node, true)) + { m_useCustomSettingAsset = newUseCustomAsset; - onValueChanged (); - if (m_importerEditor != null) { - UnityEngine.Object.DestroyImmediate (m_importerEditor); + onValueChanged(); + if (m_importerEditor != null) + { + UnityEngine.Object.DestroyImmediate(m_importerEditor); m_importerEditor = null; } } } - if (m_useCustomSettingAsset) { - var newObject = EditorGUILayout.ObjectField ("Asset", CustomSettingAsset, assetType, false); - if (importerType == typeof(ModelImporter) && newObject != null) { + if (m_useCustomSettingAsset) + { + var newObject = EditorGUILayout.ObjectField("Asset", CustomSettingAsset, assetType, false); + if (importerType == typeof(ModelImporter) && newObject != null) + { // disallow selecting non-model prefab - if (PrefabUtility.GetPrefabAssetType(newObject) != PrefabAssetType.Model) { + if (PrefabUtility.GetPrefabAssetType(newObject) != PrefabAssetType.Model) + { newObject = CustomSettingAsset; } } - if (importerType == typeof(TrueTypeFontImporter) && newObject != null) { - var selectedAssetPath = AssetDatabase.GetAssetPath (newObject); - var importer = AssetImporter.GetAtPath (selectedAssetPath); + if (importerType == typeof(TrueTypeFontImporter) && newObject != null) + { + var selectedAssetPath = AssetDatabase.GetAssetPath(newObject); + var importer = AssetImporter.GetAtPath(selectedAssetPath); // disallow selecting Custom Font - if (importer != null && importer.GetType() != typeof(TrueTypeFontImporter)) { + if (importer != null && importer.GetType() != typeof(TrueTypeFontImporter)) + { newObject = CustomSettingAsset; } } - if (newObject != CustomSettingAsset) { - using (new RecordUndoScope ("Change Custom Setting Asset", node, true)) { + if (newObject != CustomSettingAsset) + { + using (new RecordUndoScope("Change Custom Setting Asset", node, true)) + { CustomSettingAsset = newObject; - onValueChanged (); + onValueChanged(); } } - if (CustomSettingAsset != null) { - using (new EditorGUILayout.HorizontalScope ()) { - GUILayout.FlexibleSpace (); - if (GUILayout.Button ("Highlight in Project Window", GUILayout.Width (180f))) { - EditorGUIUtility.PingObject (CustomSettingAsset); + if (CustomSettingAsset != null) + { + using (new EditorGUILayout.HorizontalScope()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Highlight in Project Window", GUILayout.Width(180f))) + { + EditorGUIUtility.PingObject(CustomSettingAsset); } } } } - EditorGUILayout.HelpBox ( - "Custom setting asset is useful when you need specific needs for setting asset; i.e. when configuring with multiple sprite mode.", + EditorGUILayout.HelpBox( + "Custom setting asset is useful when you need specific needs for setting asset; i.e. when configuring with multiple sprite mode.", MessageType.Info); } } - public override void Prepare (BuildTarget target, - Model.NodeData node, - IEnumerable incoming, - IEnumerable connectionsToOutput, - PerformGraph.Output Output) - { + public override void Prepare(BuildTarget target, + Model.NodeData node, + IEnumerable incoming, + IEnumerable connectionsToOutput, + PerformGraph.Output Output) + { ValidateInputSetting(node, target, incoming); - // ImportSettings does not add, filter or change structure of group, so just pass given group of assets - if(Output != null) { - var dst = (connectionsToOutput == null || !connectionsToOutput.Any())? - null : connectionsToOutput.First(); - - if(incoming != null) { - foreach(var ag in incoming) { - Output(dst, ag.assetGroups); - } - } else { - Output(dst, new Dictionary>()); - } - } - } - - public override void Build (BuildTarget target, - Model.NodeData node, - IEnumerable incoming, - IEnumerable connectionsToOutput, - PerformGraph.Output Output, - Action progressFunc) - { - if(incoming != null){ - ApplyImportSetting(target, node, incoming); - } - } - - private void CreateConfigurator(Model.NodeData node, Type importerType) { - - var configFileGUID = ImporterConfiguratorUtility.FindSettingTemplateFileGUID (importerType); - var configFilePath = AssetDatabase.GUIDToAssetPath (configFileGUID); - - if (string.IsNullOrEmpty (configFilePath)) { - throw new NodeException("Setting template file not found. Incoming file type must be properly configured with CustomImporterConfigurator.", + // ImportSettings does not add, filter or change structure of group, so just pass given group of assets + if (Output != null) + { + var dst = (connectionsToOutput == null || !connectionsToOutput.Any()) ? + null : connectionsToOutput.First(); + + if (incoming != null) + { + foreach (var ag in incoming) + { + Output(dst, ag.assetGroups); + } + } + else + { + Output(dst, new Dictionary>()); + } + } + } + + public override void Build(BuildTarget target, + Model.NodeData node, + IEnumerable incoming, + IEnumerable connectionsToOutput, + PerformGraph.Output Output, + Action progressFunc) + { + if (incoming != null) + { + ApplyImportSetting(target, node, incoming); + } + } + + private void CreateConfigurator(Model.NodeData node, Type importerType) + { + + var configFileGUID = ImporterConfiguratorUtility.FindSettingTemplateFileGUID(importerType); + var configFilePath = AssetDatabase.GUIDToAssetPath(configFileGUID); + + if (string.IsNullOrEmpty(configFilePath)) + { + throw new NodeException("Setting template file not found. Incoming file type must be properly configured with CustomImporterConfigurator.", "Place setting file template for this file type in SettingTemplate folder in your project.", node); } var samplingDirectoryPath = FileUtility.PathCombine(Model.Settings.Path.SavedSettingsPath, "ImportSettings", node.Id); - if (!Directory.Exists(samplingDirectoryPath)) { - Directory.CreateDirectory(samplingDirectoryPath); - } + if (!Directory.Exists(samplingDirectoryPath)) + { + Directory.CreateDirectory(samplingDirectoryPath); + } - IAssetImporterConfigurator configurator = ImporterConfiguratorUtility.CreateConfigurator (importerType); - if (configurator == null) { + IAssetImporterConfigurator configurator = ImporterConfiguratorUtility.CreateConfigurator(importerType); + if (configurator == null) + { throw new NodeException("Failed to create importer configurator for " + importerType.FullName, "Make sure CustomAssetImporterConfigurator for this type is added in your project.", node); } - m_configuratorInstance.SetDefaultValue (configurator); + m_configuratorInstance.SetDefaultValue(configurator); var targetFilePath = FileUtility.PathCombine(samplingDirectoryPath, Path.GetFileName(configFilePath)); FileUtility.CopyFile(configFilePath, targetFilePath); - AssetDatabase.Refresh(ImportAssetOptions.ImportRecursive); + AssetDatabase.Refresh(ImportAssetOptions.ImportRecursive); - m_referenceAssetGuid = AssetDatabase.AssetPathToGUID (targetFilePath); - } + m_referenceAssetGuid = AssetDatabase.AssetPathToGUID(targetFilePath); + } - public void ResetConfig(Model.NodeData node) { + public void ResetConfig(Model.NodeData node) + { m_useCustomSettingAsset = false; CustomSettingAssetGuid = string.Empty; m_referenceAssetGuid = null; - m_configuratorInstance = new SerializableMultiTargetInstance (); + m_configuratorInstance = new SerializableMultiTargetInstance(); var sampleFileDir = FileUtility.PathCombine(Model.Settings.Path.SavedSettingsPath, "ImportSettings", node.Id); - FileUtility.RemakeDirectory(sampleFileDir); - } + FileUtility.RemakeDirectory(sampleFileDir); + } - private AssetImporter GetReferenceAssetImporter(Model.NodeData node, bool allowCustom) { + private AssetImporter GetReferenceAssetImporter(Model.NodeData node, bool allowCustom) + { - if (allowCustom) { - if (m_useCustomSettingAsset) { - if (CustomSettingAsset != null) { - var path = AssetDatabase.GUIDToAssetPath (CustomSettingAssetGuid); - return AssetImporter.GetAtPath (path); - } + if (allowCustom) + { + if (m_useCustomSettingAsset) + { + if (CustomSettingAsset != null) + { + var path = AssetDatabase.GUIDToAssetPath(CustomSettingAssetGuid); + return AssetImporter.GetAtPath(path); + } return null; } } - if (!string.IsNullOrEmpty(m_referenceAssetGuid)) { - var path = AssetDatabase.GUIDToAssetPath (m_referenceAssetGuid); - return AssetImporter.GetAtPath (path); + if (!string.IsNullOrEmpty(m_referenceAssetGuid)) + { + var path = AssetDatabase.GUIDToAssetPath(m_referenceAssetGuid); + return AssetImporter.GetAtPath(path); } return null; - } + } - private void ApplyImportSetting(BuildTarget target, Model.NodeData node, IEnumerable incoming) { + private void ApplyImportSetting(BuildTarget target, Model.NodeData node, IEnumerable incoming) + { - var referenceImporter = GetReferenceAssetImporter(node, true); + var referenceImporter = GetReferenceAssetImporter(node, true); - var configurator = m_configuratorInstance.Get (target); - UnityEngine.Assertions.Assert.IsNotNull (configurator); + var configurator = m_configuratorInstance.Get(target); + UnityEngine.Assertions.Assert.IsNotNull(configurator); - foreach(var ag in incoming) { - foreach(var groupKey in ag.assetGroups.Keys) { - var assets = ag.assetGroups[groupKey]; - foreach(var asset in assets) { + foreach (var ag in incoming) + { + foreach (var groupKey in ag.assetGroups.Keys) + { + var assets = ag.assetGroups[groupKey]; + foreach (var asset in assets) + { // skip if incoming asset is this custom setting asset - if (m_useCustomSettingAsset) { - var assetGuid = AssetDatabase.AssetPathToGUID (asset.importFrom); - if (assetGuid == m_customSettingAssetGuid) { + if (m_useCustomSettingAsset) + { + var assetGuid = AssetDatabase.AssetPathToGUID(asset.importFrom); + if (assetGuid == m_customSettingAssetGuid) + { continue; } } - var importer = AssetImporter.GetAtPath(asset.importFrom); - bool importerModified = false; - - if(configurator.IsModified(referenceImporter, importer, target, groupKey)) { + var importer = AssetImporter.GetAtPath(asset.importFrom); + if (configurator.IsModified(referenceImporter, importer, target, groupKey)) + { configurator.Configure(referenceImporter, importer, target, groupKey); - AssetProcessEventRecord.GetRecord ().LogModify (asset); - importerModified = true; - } - - if(importerModified) { - importer.SaveAndReimport(); - asset.TouchImportAsset(); - } - } - } - } - } - - private void ValidateInputSetting ( - Model.NodeData node, - BuildTarget target, - IEnumerable incoming) + AssetProcessEventRecord.GetRecord().LogModify(asset); + importer.SaveAndReimport(); + asset.TouchImportAsset(); + } + } + } + } + } + + private void ValidateInputSetting( + Model.NodeData node, + BuildTarget target, + IEnumerable incoming) { - var firstAsset = AssetReferenceUtility.FindFirstIncomingAssetReference (incoming); + var firstAsset = AssetReferenceUtility.FindFirstIncomingAssetReference(incoming); Type firstAssetImporterType = null; // check if first Asset has importer - if (firstAsset != null) { + if (firstAsset != null) + { firstAssetImporterType = firstAsset.importerType; - if (firstAssetImporterType == null) { + if (firstAssetImporterType == null) + { throw new NodeException( - $"Incoming asset '{firstAsset.fileNameAndExtension}' does not have importer. (type={firstAsset.assetType.FullName}) Perhaps you want to use Modifier instead?", + $"Incoming asset '{firstAsset.fileNameAndExtension}' does not have importer. (type={firstAsset.assetType.FullName}) Perhaps you want to use Modifier instead?", "Add ScriptedImporter for this type of asset or replace this node to use Modifier.", node); } } // check if all incoming assets are the same asset types - if(firstAssetImporterType != null) { - foreach(var ag in incoming) { - foreach(var assets in ag.assetGroups.Values) { - foreach(var a in assets) { - if(a.importerType != firstAssetImporterType) { + if (firstAssetImporterType != null) + { + foreach (var ag in incoming) + { + foreach (var assets in ag.assetGroups.Values) + { + foreach (var a in assets) + { + if (a.importerType != firstAssetImporterType) + { throw new NodeException( $"ImportSetting expect {firstAssetImporterType.FullName}, but different type of incoming asset is found({a.fileNameAndExtension}, {a.importerType})", $"Remove {a.fileName} from node input, or change this importer type.", @@ -477,27 +564,30 @@ private void ValidateInputSetting ( } } } - } + } // check if there is a valid custom setting asset - if (m_useCustomSettingAsset && CustomSettingAsset == null) { + if (m_useCustomSettingAsset && CustomSettingAsset == null) + { throw new NodeException("You must select custom setting asset.", "Select custom setting asset.", node); } - + // check if there is a valid reference asset - var referenceImporter = GetReferenceAssetImporter (node, false); + var referenceImporter = GetReferenceAssetImporter(node, false); - if (referenceImporter == null) { + if (referenceImporter == null) + { throw new NodeException("Reference importer not found.", "Configure reference importer from inspector", node); } // check if reference asset type matches with incoming asset types - if(firstAssetImporterType != null) + if (firstAssetImporterType != null) { Type targetType = referenceImporter.GetType(); - if( targetType != firstAssetImporterType ) { + if (targetType != firstAssetImporterType) + { throw new NodeException( $"Incoming asset type is does not match with this ImportSetting (Expected type:{targetType.FullName}, Incoming type:{firstAssetImporterType.FullName}).", $"Remove {firstAsset.fileName} from incoming assets.", node); @@ -505,22 +595,25 @@ private void ValidateInputSetting ( } // check if there is valid configurator for this asset importer - var importer = GetReferenceAssetImporter (node, true); - if (importer != null) { - var configuratorType = ImporterConfiguratorUtility.GetConfiguratorTypeFor (importer.GetType()); - if (configuratorType == null) { - throw new NodeException ( - $"Configurator for {importer.GetType().FullName} not found.", - string.Format ("Add CustomAssetImporterConfigurator."), + var importer = GetReferenceAssetImporter(node, true); + if (importer != null) + { + var configuratorType = ImporterConfiguratorUtility.GetConfiguratorTypeFor(importer.GetType()); + if (configuratorType == null) + { + throw new NodeException( + $"Configurator for {importer.GetType().FullName} not found.", + string.Format("Add CustomAssetImporterConfigurator."), node); } - var c = m_configuratorInstance.Get (target); - if (c == null) { + var c = m_configuratorInstance.Get(target); + if (c == null) + { throw new NodeException("Failed to get configurator for " + importer.GetType().FullName, "You may need to reset this node.", node); } } - } - } + } + } } diff --git a/Editor/System/Node/Buitin/Modifier.cs b/Editor/System/Node/Buitin/Modifier.cs index 3cb2bb18d..1664fb7bf 100644 --- a/Editor/System/Node/Buitin/Modifier.cs +++ b/Editor/System/Node/Buitin/Modifier.cs @@ -4,328 +4,409 @@ using System; using System.Linq; using System.Collections.Generic; -using V1=AssetBundleGraph; -using Model=UnityEngine.AssetGraph.DataModel.Version2; +using V1 = AssetBundleGraph; +using Model = UnityEngine.AssetGraph.DataModel.Version2; -namespace UnityEngine.AssetGraph { +namespace UnityEngine.AssetGraph +{ - [CustomNode("Modify Assets/Modify Assets", 61)] - public class Modifier : Node, Model.NodeDataImporter { + [CustomNode("Modify Assets/Modify Assets", 61)] + public class Modifier : Node, Model.NodeDataImporter + { - [SerializeField] private SerializableMultiTargetInstance m_instance; + [SerializeField] private SerializableMultiTargetInstance m_instance; [SerializeField] private string m_modifierType; - public override string ActiveStyle { - get { - return "node 8 on"; - } - } - - public override string InactiveStyle { - get { - return "node 8"; - } - } - - public override string Category { - get { - return "Modify"; - } - } - - public IModifier GetModifier(BuildTarget target) - { - return m_instance.Get(target); - } - - public override void Initialize(Model.NodeData data) { - m_instance = new SerializableMultiTargetInstance(); + public override string ActiveStyle + { + get + { + return "node 8 on"; + } + } + + public override string InactiveStyle + { + get + { + return "node 8"; + } + } + + public override string Category + { + get + { + return "Modify"; + } + } + + public IModifier GetModifier(BuildTarget target) + { + return m_instance.Get(target); + } + + public override void Initialize(Model.NodeData data) + { + m_instance = new SerializableMultiTargetInstance(); m_modifierType = string.Empty; - data.AddDefaultInputPoint(); - data.AddDefaultOutputPoint(); - } + data.AddDefaultInputPoint(); + data.AddDefaultOutputPoint(); + } - public void Import(V1.NodeData v1, Model.NodeData v2) { - m_instance = new SerializableMultiTargetInstance(v1.ScriptClassName, v1.InstanceData); + public void Import(V1.NodeData v1, Model.NodeData v2) + { + m_instance = new SerializableMultiTargetInstance(v1.ScriptClassName, v1.InstanceData); m_modifierType = string.Empty; - } + } - public override Node Clone(Model.NodeData newData) { - var newNode = new Modifier(); - newNode.m_instance = new SerializableMultiTargetInstance(m_instance); + public override Node Clone(Model.NodeData newData) + { + var newNode = new Modifier(); + newNode.m_instance = new SerializableMultiTargetInstance(m_instance); newNode.m_modifierType = m_modifierType; - newData.AddDefaultInputPoint(); - newData.AddDefaultOutputPoint(); + newData.AddDefaultInputPoint(); + newData.AddDefaultOutputPoint(); - return newNode; - } + return newNode; + } - public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager streamManager, NodeGUIEditor editor, Action onValueChanged) { + public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager streamManager, NodeGUIEditor editor, Action onValueChanged) + { - EditorGUILayout.HelpBox("Modify Assets Directly: Modify assets.", MessageType.Info); - editor.UpdateNodeName(node); + EditorGUILayout.HelpBox("Modify Assets Directly: Modify assets.", MessageType.Info); + editor.UpdateNodeName(node); - GUILayout.Space(10f); + GUILayout.Space(10f); - using (new EditorGUILayout.VerticalScope(GUI.skin.box)) { - if (string.IsNullOrEmpty (m_modifierType)) { - EditorGUILayout.HelpBox ("Select asset type to modify with this node.", MessageType.Info); - using (new EditorGUILayout.HorizontalScope ()) { - EditorGUILayout.LabelField ("Asset Type"); - if (GUILayout.Button ("", "Popup", GUILayout.MinWidth (150f))) { + using (new EditorGUILayout.VerticalScope(GUI.skin.box)) + { + if (string.IsNullOrEmpty(m_modifierType)) + { + EditorGUILayout.HelpBox("Select asset type to modify with this node.", MessageType.Info); + using (new EditorGUILayout.HorizontalScope()) + { + EditorGUILayout.LabelField("Asset Type"); + if (GUILayout.Button("", "Popup", GUILayout.MinWidth(150f))) + { - var menu = new GenericMenu (); + var menu = new GenericMenu(); - var types = ModifierUtility.GetModifyableTypes ().ToArray(); + var types = ModifierUtility.GetModifyableTypes().ToArray(); - for (var i = 0; i < types.Length; i++) { + for (var i = 0; i < types.Length; i++) + { var index = i; - menu.AddItem ( - new GUIContent (types [i].Name), + menu.AddItem( + new GUIContent(types[i].Name), false, - () => { + () => + { ResetConfig(); m_modifierType = types[index].AssemblyQualifiedName; } ); } - menu.ShowAsContext (); + menu.ShowAsContext(); } } return; } - var targetType = Type.GetType (m_modifierType); - var modifier = m_instance.Get(editor.CurrentEditingGroup); + var targetType = Type.GetType(m_modifierType); + var modifier = m_instance.Get(editor.CurrentEditingGroup); - Dictionary map = null; + Dictionary map = null; - if(targetType != null) { - EditorGUILayout.LabelField ("Asset Type", targetType.Name); + if (targetType != null) + { + EditorGUILayout.LabelField("Asset Type", targetType.Name); map = ModifierUtility.GetAttributeAssemblyQualifiedNameMap(targetType); - } + } - if(map != null && map.Count > 0) { - using(new GUILayout.HorizontalScope()) { - GUILayout.Label("Modifier"); + if (map != null && map.Count > 0) + { + using (new GUILayout.HorizontalScope()) + { + GUILayout.Label("Modifier"); var guiName = ModifierUtility.GetModifierGUIName(m_instance.ClassName); - if (GUILayout.Button(guiName, "Popup", GUILayout.MinWidth(150f))) { - var builders = map.Keys.ToList(); - - if(builders.Count > 0) { - NodeGUI.ShowTypeNamesMenu(guiName, builders, (string selectedGUIName) => - { - using(new RecordUndoScope("Change Modifier class", node, true)) { + if (GUILayout.Button(guiName, "Popup", GUILayout.MinWidth(150f))) + { + var builders = map.Keys.ToList(); + + if (builders.Count > 0) + { + NodeGUI.ShowTypeNamesMenu(guiName, builders, (string selectedGUIName) => + { + using (new RecordUndoScope("Change Modifier class", node, true)) + { modifier = ModifierUtility.CreateModifier(selectedGUIName, targetType); - m_instance.Set(editor.CurrentEditingGroup,modifier); - onValueChanged(); - } - } - ); - } - } - - MonoScript s = TypeUtility.LoadMonoScript(m_instance.ClassName); - - using(new EditorGUI.DisabledScope(s == null)) { - if(GUILayout.Button("Edit", GUILayout.Width(50))) { - AssetDatabase.OpenAsset(s, 0); - } - } - } - - } else { - - string[] menuNames = Model.Settings.GUI_TEXT_MENU_GENERATE_MODIFIER.Split('/'); - - if (targetType == null) { - EditorGUILayout.HelpBox( - "You need to create at least one Modifier script to select script for Modifier. " + - $"To start, select {menuNames[1]}>{menuNames[2]}>{menuNames[3]} menu and create a new script.", MessageType.Info); - } else { - EditorGUILayout.HelpBox( - string.Format( - "No CustomModifier found for {3} type. \n" + - "You need to create at least one Modifier script to select script for Modifier. " + - "To start, select {0}>{1}>{2} menu and create a new script.", - menuNames[1],menuNames[2], menuNames[3], targetType.FullName - ), MessageType.Info); - } - } - - GUILayout.Space(10f); - - editor.DrawPlatformSelector(node); - using (new EditorGUILayout.VerticalScope()) { - var disabledScope = editor.DrawOverrideTargetToggle(node, m_instance.ContainsValueOf(editor.CurrentEditingGroup), (bool enabled) => { - if(enabled) { - m_instance.CopyDefaultValueTo(editor.CurrentEditingGroup); - } else { - m_instance.Remove(editor.CurrentEditingGroup); - } - onValueChanged(); - }); - - using (disabledScope) { - if (modifier != null) { - Action onChangedAction = () => { - using(new RecordUndoScope("Change Modifier Setting", node)) { - m_instance.Set(editor.CurrentEditingGroup, modifier); - onValueChanged(); - } - }; - - modifier.OnInspectorGUI(onChangedAction); - } - } - } - - GUILayout.Space (40f); - using (new EditorGUILayout.HorizontalScope (GUI.skin.box)) { - GUILayout.Space (4f); - EditorGUILayout.LabelField ("Reset Modifier Setting"); - - if (GUILayout.Button ("Clear")) { - if (EditorUtility.DisplayDialog ("Clear Modifier Setting", - $"Do you want to reset modifier for \"{node.Name}\"?", "OK", "Cancel")) + m_instance.Set(editor.CurrentEditingGroup, modifier); + onValueChanged(); + } + } + ); + } + } + + MonoScript s = m_instance.MonoScript; + + using (new EditorGUI.DisabledScope(s == null)) + { + if (GUILayout.Button("Edit", GUILayout.Width(50))) + { + AssetDatabase.OpenAsset(s, 0); + } + } + } + + } + else + { + + string[] menuNames = Model.Settings.GUI_TEXT_MENU_GENERATE_MODIFIER.Split('/'); + + if (targetType == null) + { + EditorGUILayout.HelpBox( + "You need to create at least one Modifier script to select script for Modifier. " + + $"To start, select {menuNames[1]}>{menuNames[2]}>{menuNames[3]} menu and create a new script.", MessageType.Info); + } + else + { + EditorGUILayout.HelpBox( + string.Format( + "No CustomModifier found for {3} type. \n" + + "You need to create at least one Modifier script to select script for Modifier. " + + "To start, select {0}>{1}>{2} menu and create a new script.", + menuNames[1], menuNames[2], menuNames[3], targetType.FullName + ), MessageType.Info); + } + } + + GUILayout.Space(10f); + + editor.DrawPlatformSelector(node); + using (new EditorGUILayout.VerticalScope()) + { + var disabledScope = editor.DrawOverrideTargetToggle(node, m_instance.ContainsValueOf(editor.CurrentEditingGroup), (bool enabled) => + { + if (enabled) + { + m_instance.CopyDefaultValueTo(editor.CurrentEditingGroup); + } + else + { + m_instance.Remove(editor.CurrentEditingGroup); + } + onValueChanged(); + }); + + using (disabledScope) + { + if (modifier != null) + { + Action onChangedAction = () => + { + using (new RecordUndoScope("Change Modifier Setting", node)) + { + m_instance.Set(editor.CurrentEditingGroup, modifier); + onValueChanged(); + } + }; + + modifier.OnInspectorGUI(onChangedAction); + } + } + } + + GUILayout.Space(40f); + using (new EditorGUILayout.HorizontalScope(GUI.skin.box)) + { + GUILayout.Space(4f); + EditorGUILayout.LabelField("Reset Modifier Setting"); + + if (GUILayout.Button("Clear")) + { + if (EditorUtility.DisplayDialog("Clear Modifier Setting", + $"Do you want to reset modifier for \"{node.Name}\"?", "OK", "Cancel")) { - using (new RecordUndoScope ("Clear Modifier Setting", node)) { - ResetConfig (); + using (new RecordUndoScope("Clear Modifier Setting", node)) + { + ResetConfig(); } } } } - } - } - - public override void OnContextMenuGUI(GenericMenu menu) { - MonoScript s = TypeUtility.LoadMonoScript(m_instance.ClassName); - if(s != null) { - menu.AddItem( - new GUIContent("Edit Script"), - false, - () => { - AssetDatabase.OpenAsset(s, 0); - } - ); - } - } - - public override void Prepare (BuildTarget target, - Model.NodeData node, - IEnumerable incoming, - IEnumerable connectionsToOutput, - PerformGraph.Output Output) - { - var modifier = m_instance.Get (target); - if (modifier != null && string.IsNullOrEmpty (m_modifierType)) { - m_modifierType = ModifierUtility.GetModifierTargetType (m_instance.ClassName).AssemblyQualifiedName; } + } + + public override void OnContextMenuGUI(GenericMenu menu) + { + MonoScript s = m_instance.MonoScript; + if (s != null) + { + menu.AddItem( + new GUIContent("Edit Script"), + false, + () => + { + AssetDatabase.OpenAsset(s, 0); + } + ); + } + } + + public override void Prepare(BuildTarget target, + Model.NodeData node, + IEnumerable incoming, + IEnumerable connectionsToOutput, + PerformGraph.Output Output) + { + var modifier = m_instance.Get(target); + if (modifier != null && string.IsNullOrEmpty(m_modifierType)) + { + m_modifierType = ModifierUtility.GetModifierTargetType(m_instance.ClassName).AssemblyQualifiedName; + } + + ValidateModifier(node, target, incoming); + + if (incoming != null && Output != null) + { + // Modifier does not add, filter or change structure of group, so just pass given group of assets + var dst = (connectionsToOutput == null || !connectionsToOutput.Any()) ? + null : connectionsToOutput.First(); + + foreach (var ag in incoming) + { + Output(dst, ag.assetGroups); + } + } + } + - ValidateModifier (node, target, incoming); - - if(incoming != null && Output != null) { - // Modifier does not add, filter or change structure of group, so just pass given group of assets - var dst = (connectionsToOutput == null || !connectionsToOutput.Any())? - null : connectionsToOutput.First(); - - foreach(var ag in incoming) { - Output(dst, ag.assetGroups); - } - } - } - - - public override void Build (BuildTarget target, - Model.NodeData node, - IEnumerable incoming, - IEnumerable connectionsToOutput, - PerformGraph.Output Output, - Action progressFunc) - { - if(incoming == null) { - return; - } - var modifier = m_instance.Get(target); - UnityEngine.Assertions.Assert.IsNotNull(modifier); - Type targetType = ModifierUtility.GetModifierTargetType (m_instance.ClassName); - bool isAnyAssetModified = false; + public override void Build(BuildTarget target, + Model.NodeData node, + IEnumerable incoming, + IEnumerable connectionsToOutput, + PerformGraph.Output Output, + Action progressFunc) + { + if (incoming == null) + { + return; + } + var modifier = m_instance.Get(target); + UnityEngine.Assertions.Assert.IsNotNull(modifier); + Type targetType = ModifierUtility.GetModifierTargetType(m_instance.ClassName); + bool isAnyAssetModified = false; var aggregatedGroups = new Dictionary>(); - foreach(var ag in incoming) { - foreach(var name in ag.assetGroups.Keys) { - if(!aggregatedGroups.ContainsKey(name)) { + foreach (var ag in incoming) + { + foreach (var name in ag.assetGroups.Keys) + { + if (!aggregatedGroups.ContainsKey(name)) + { aggregatedGroups[name] = new List(); } aggregatedGroups[name].AddRange(ag.assetGroups[name].AsEnumerable()); } } - foreach(var assets in aggregatedGroups.Values) { - foreach(var asset in assets) { - if (asset.assetType == targetType) { - if(modifier.IsModified(asset.allData, assets)) { - modifier.Modify(asset.allData, assets); - asset.SetDirty(); - AssetProcessEventRecord.GetRecord ().LogModify (asset); - - isAnyAssetModified = true; - - // apply asset setting changes to AssetDatabase. - if (asset.isSceneAsset) { - if (!EditorSceneManager.SaveScene (asset.scene)) { - throw new NodeException ("Failed to save modified scene:" + asset.importFrom, "See console for details.", node); + try + { + AssetDatabase.StartAssetEditing(); + foreach (var assets in aggregatedGroups.Values) + { + foreach (var asset in assets) + { + if (asset.assetType == targetType) + { + if (modifier.IsModified(asset.allData, assets)) + { + modifier.Modify(asset.allData, assets); + if (asset.isSceneAsset || AssetDatabase.LoadAllAssetsAtPath(asset.importFrom).Any(EditorUtility.IsDirty)) + { + isAnyAssetModified = true; + asset.SetDirty(); + AssetProcessEventRecord.GetRecord().LogModify(asset); + + if (asset.isSceneAsset) + { + if (!EditorSceneManager.SaveScene(asset.scene)) + { + throw new NodeException("Failed to save modified scene:" + asset.importFrom, "See console for details.", node); + } + } } - } else { - AssetDatabase.SaveAssets (); } } - asset.ReleaseData (); } - } - } + } + } + catch + { + throw; + } + finally + { + AssetDatabase.StopAssetEditing(); + } - if(isAnyAssetModified) { - AssetDatabase.Refresh(); - } + if (isAnyAssetModified) + { + AssetDatabase.Refresh(); + AssetDatabase.SaveAssets(); + } + + foreach (var assets in aggregatedGroups.Values) + foreach (var asset in assets) + if (asset.assetType == targetType) + asset.ReleaseData(); - if(incoming != null && Output != null) { - // Modifier does not add, filter or change structure of group, so just pass given group of assets - var dst = (connectionsToOutput == null || !connectionsToOutput.Any())? - null : connectionsToOutput.First(); + if (incoming != null && Output != null) + { + // Modifier does not add, filter or change structure of group, so just pass given group of assets + var dst = (connectionsToOutput == null || !connectionsToOutput.Any()) ? + null : connectionsToOutput.First(); Output(dst, aggregatedGroups); - } - } + } + } - private void ResetConfig() { + private void ResetConfig() + { m_modifierType = string.Empty; - m_instance = new SerializableMultiTargetInstance (); + m_instance = new SerializableMultiTargetInstance(); } - - public void ValidateModifier ( - Model.NodeData node, - BuildTarget target, - IEnumerable incoming) + + public void ValidateModifier( + Model.NodeData node, + BuildTarget target, + IEnumerable incoming) { - if (string.IsNullOrEmpty (m_modifierType)) { + if (string.IsNullOrEmpty(m_modifierType)) + { throw new NodeException("Modifier asset type not set.", "Select asset type to modify from inspector.", node); } - var modifier = m_instance.Get (target); - if(modifier == null) { + var modifier = m_instance.Get(target); + if (modifier == null) + { throw new NodeException("Failed to create Modifier.", "Select modifier from inspector.", node); - } - modifier.OnValidate (); + } + modifier.OnValidate(); - Type expected = Type.GetType (m_modifierType); - Type modifierFor = ModifierUtility.GetModifierTargetType (m_instance.ClassName); + Type expected = Type.GetType(m_modifierType); + Type modifierFor = ModifierUtility.GetModifierTargetType(m_instance.ClassName); - if (expected != modifierFor) { + if (expected != modifierFor) + { throw new NodeException("Modifier type does not match.", "Reset setting or fix Modifier code.", node); } - } - } + } + } } diff --git a/Editor/System/Node/Buitin/PrefabBuilder.cs b/Editor/System/Node/Buitin/PrefabBuilder.cs index 139c9951e..1fa49a06f 100644 --- a/Editor/System/Node/Buitin/PrefabBuilder.cs +++ b/Editor/System/Node/Buitin/PrefabBuilder.cs @@ -115,7 +115,7 @@ public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager st } } - MonoScript s = TypeUtility.LoadMonoScript(m_instance.ClassName); + MonoScript s = m_instance.MonoScript; using(new EditorGUI.DisabledScope(s == null)) { if(GUILayout.Button("Edit", GUILayout.Width(50))) { @@ -263,7 +263,7 @@ public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager st } public override void OnContextMenuGUI(GenericMenu menu) { - MonoScript s = TypeUtility.LoadMonoScript(m_instance.ClassName); + MonoScript s = m_instance.MonoScript; if(s != null) { menu.AddItem( new GUIContent("Edit Script"),