From 58214861e1885c3aabce1fef6e69914e9c35149b Mon Sep 17 00:00:00 2001 From: momoma Date: Sat, 20 Feb 2021 17:54:32 +0900 Subject: [PATCH 01/10] Fixed very heavy process when there are many assets --- Editor/System/Model/SerializableMultiTargetInstance.cs | 3 +++ Editor/System/Node/Buitin/AssetGenerator.cs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Editor/System/Model/SerializableMultiTargetInstance.cs b/Editor/System/Model/SerializableMultiTargetInstance.cs index 82674747..605935a0 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); diff --git a/Editor/System/Node/Buitin/AssetGenerator.cs b/Editor/System/Node/Buitin/AssetGenerator.cs index b1baa055..c06b0c40 100644 --- a/Editor/System/Node/Buitin/AssetGenerator.cs +++ b/Editor/System/Node/Buitin/AssetGenerator.cs @@ -159,7 +159,7 @@ private void DrawGeneratorSetting( } } - 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))) { From 9011630d5e0ef62c4a2fc05d3876c2876462092f Mon Sep 17 00:00:00 2001 From: momoma Date: Sat, 20 Feb 2021 18:00:40 +0900 Subject: [PATCH 02/10] Fixed very heavy process when there are many assets --- Editor/System/Node/Buitin/AssetGenerator.cs | 2 +- Editor/System/Node/Buitin/Modifier.cs | 4 ++-- Editor/System/Node/Buitin/PrefabBuilder.cs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Editor/System/Node/Buitin/AssetGenerator.cs b/Editor/System/Node/Buitin/AssetGenerator.cs index c06b0c40..c721e180 100644 --- a/Editor/System/Node/Buitin/AssetGenerator.cs +++ b/Editor/System/Node/Buitin/AssetGenerator.cs @@ -352,7 +352,7 @@ public override void OnInspectorGUI(NodeGUI node, AssetReferenceStreamManager st public override void OnContextMenuGUI(GenericMenu menu) { foreach (var s in m_entries) { - MonoScript script = TypeUtility.LoadMonoScript(s.m_instance.ClassName); + MonoScript script = s.m_instance.MonoScript; if(script != null) { menu.AddItem( new GUIContent($"Edit Script({script.name})"), diff --git a/Editor/System/Node/Buitin/Modifier.cs b/Editor/System/Node/Buitin/Modifier.cs index 3cb2bb18..54ffe871 100644 --- a/Editor/System/Node/Buitin/Modifier.cs +++ b/Editor/System/Node/Buitin/Modifier.cs @@ -128,7 +128,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))) { @@ -202,7 +202,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"), diff --git a/Editor/System/Node/Buitin/PrefabBuilder.cs b/Editor/System/Node/Buitin/PrefabBuilder.cs index 139c9951..1fa49a06 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"), From 099fc9e84cca3888265a5cc3d451336de057d844 Mon Sep 17 00:00:00 2001 From: momoma Date: Thu, 1 Apr 2021 16:27:12 +0900 Subject: [PATCH 03/10] Fixed to use StartAssetEditing() / StopAssetEditing() --- Editor/System/Node/Buitin/Modifier.cs | 574 +++++++++++++++----------- 1 file changed, 323 insertions(+), 251 deletions(-) diff --git a/Editor/System/Node/Buitin/Modifier.cs b/Editor/System/Node/Buitin/Modifier.cs index 54ffe871..2b169f18 100644 --- a/Editor/System/Node/Buitin/Modifier.cs +++ b/Editor/System/Node/Buitin/Modifier.cs @@ -4,328 +4,400 @@ 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 = 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")) + 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) { - using (new RecordUndoScope ("Clear Modifier Setting", node)) { - ResetConfig (); + 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(); } } } } - } - } - - 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; } + } + + 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); - 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; + 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; 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); + 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); + } } - } else { - AssetDatabase.SaveAssets (); } + asset.ReleaseData(); } - asset.ReleaseData (); } - } - } + } + } + finally + { + AssetDatabase.StopAssetEditing(); + } - if(isAnyAssetModified) { - AssetDatabase.Refresh(); - } + if (isAnyAssetModified) + { + AssetDatabase.Refresh(); + AssetDatabase.SaveAssets(); + } - 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); } - } - } + } + } } From 5e566c9158c9d953fabdfd28b7667ec01612f679 Mon Sep 17 00:00:00 2001 From: momoma Date: Thu, 1 Apr 2021 16:28:04 +0900 Subject: [PATCH 04/10] Fixed binding flags --- Editor/System/Modifiers/SetProperty.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Editor/System/Modifiers/SetProperty.cs b/Editor/System/Modifiers/SetProperty.cs index b65fc7b4..dac508f7 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) { From 0cabb8a02f5efdc915ccc6e351824c3d73d5f2a5 Mon Sep 17 00:00:00 2001 From: momoma Date: Thu, 1 Apr 2021 16:29:05 +0900 Subject: [PATCH 05/10] change of meta --- Editor/SettingTemplate/setting.m4v.meta | 3 --- 1 file changed, 3 deletions(-) diff --git a/Editor/SettingTemplate/setting.m4v.meta b/Editor/SettingTemplate/setting.m4v.meta index a01a3eb1..fafacdd6 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 From 4e83e97dba53c31deef2464e121e4322f5d75c22 Mon Sep 17 00:00:00 2001 From: momoma Date: Mon, 5 Apr 2021 15:06:45 +0900 Subject: [PATCH 06/10] Optimized to skip no updated importers' process --- Editor/System/Node/Buitin/ImportSetting.cs | 661 ++++++++++++--------- 1 file changed, 380 insertions(+), 281 deletions(-) diff --git a/Editor/System/Node/Buitin/ImportSetting.cs b/Editor/System/Node/Buitin/ImportSetting.cs index 86cd9498..0b1e509d 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,296 @@ 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)) { - 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) + var importer = AssetImporter.GetAtPath(asset.importFrom); + if (configurator.IsModified(referenceImporter, importer, target, groupKey)) + { + using (var importerSO = new SerializedObject(importer)) + { + configurator.Configure(referenceImporter, importer, target, groupKey); + AssetProcessEventRecord.GetRecord().LogModify(asset); + if (importerSO.UpdateIfRequiredOrScript()) + { + 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 +570,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 +601,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); } } - } - } + } + } } From 70b7147d3791182d400bb7ee337ec2ba51b0d5ce Mon Sep 17 00:00:00 2001 From: momoma Date: Tue, 6 Apr 2021 11:31:35 +0900 Subject: [PATCH 07/10] Modified to skip unchanged assets --- Editor/System/Node/Buitin/Modifier.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Editor/System/Node/Buitin/Modifier.cs b/Editor/System/Node/Buitin/Modifier.cs index 2b169f18..bdf9ee7b 100644 --- a/Editor/System/Node/Buitin/Modifier.cs +++ b/Editor/System/Node/Buitin/Modifier.cs @@ -329,17 +329,18 @@ public override void Build(BuildTarget target, 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 (asset.isSceneAsset || AssetDatabase.LoadAllAssetsAtPath(asset.importFrom).Any(EditorUtility.IsDirty)) { - if (!EditorSceneManager.SaveScene(asset.scene)) + isAnyAssetModified = true; + asset.SetDirty(); + AssetProcessEventRecord.GetRecord().LogModify(asset); + + if (asset.isSceneAsset) { - throw new NodeException("Failed to save modified scene:" + asset.importFrom, "See console for details.", node); + if (!EditorSceneManager.SaveScene(asset.scene)) + { + throw new NodeException("Failed to save modified scene:" + asset.importFrom, "See console for details.", node); + } } } } From b0a701372ef487de88dcdf1198be3ce81784dd8f Mon Sep 17 00:00:00 2001 From: momoma Date: Tue, 6 Apr 2021 14:09:34 +0900 Subject: [PATCH 08/10] Modified to exclude ConfigGraph assets in package --- Editor/System/Core/AssetGraphPostprocessor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Editor/System/Core/AssetGraphPostprocessor.cs b/Editor/System/Core/AssetGraphPostprocessor.cs index fa7d9260..3da12d09 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 (); From 5558e3aead7361ec1b9194839abefedf4d4a7c56 Mon Sep 17 00:00:00 2001 From: momoma Date: Wed, 21 Apr 2021 11:45:29 +0900 Subject: [PATCH 09/10] Fixed some issue --- Editor/SettingTemplate/setting.fbx | Bin 5808 -> 17820 bytes Editor/SettingTemplate/setting.fbx.meta | 61 +- .../Importers/ModelImporterConfigurator.cs | 34 +- Editor/System/Node/Buitin/AssetGenerator.cs | 637 +++++++++++------- Editor/System/Node/Buitin/ImportSetting.cs | 14 +- Editor/System/Node/Buitin/Modifier.cs | 10 +- 6 files changed, 470 insertions(+), 286 deletions(-) diff --git a/Editor/SettingTemplate/setting.fbx b/Editor/SettingTemplate/setting.fbx index f1bd0502ef728861764286a96d959fcfcc5507ea..0dc987b5b04e01a2f0a7492a6c65842771ad6672 100644 GIT binary patch literal 17820 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 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/Node/Buitin/AssetGenerator.cs b/Editor/System/Node/Buitin/AssetGenerator.cs index c721e180..d5fd65d0 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 = 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) { + public override void OnContextMenuGUI(GenericMenu menu) + { + foreach (var s in m_entries) + { MonoScript script = s.m_instance.MonoScript; - if(script != null) { + 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 0b1e509d..e772da43 100644 --- a/Editor/System/Node/Buitin/ImportSetting.cs +++ b/Editor/System/Node/Buitin/ImportSetting.cs @@ -514,16 +514,10 @@ private void ApplyImportSetting(BuildTarget target, Model.NodeData node, IEnumer var importer = AssetImporter.GetAtPath(asset.importFrom); if (configurator.IsModified(referenceImporter, importer, target, groupKey)) { - using (var importerSO = new SerializedObject(importer)) - { - configurator.Configure(referenceImporter, importer, target, groupKey); - AssetProcessEventRecord.GetRecord().LogModify(asset); - if (importerSO.UpdateIfRequiredOrScript()) - { - importer.SaveAndReimport(); - asset.TouchImportAsset(); - } - } + configurator.Configure(referenceImporter, importer, target, groupKey); + AssetProcessEventRecord.GetRecord().LogModify(asset); + importer.SaveAndReimport(); + asset.TouchImportAsset(); } } } diff --git a/Editor/System/Node/Buitin/Modifier.cs b/Editor/System/Node/Buitin/Modifier.cs index bdf9ee7b..1664fb7b 100644 --- a/Editor/System/Node/Buitin/Modifier.cs +++ b/Editor/System/Node/Buitin/Modifier.cs @@ -344,11 +344,14 @@ public override void Build(BuildTarget target, } } } - asset.ReleaseData(); } } } } + catch + { + throw; + } finally { AssetDatabase.StopAssetEditing(); @@ -360,6 +363,11 @@ public override void Build(BuildTarget target, 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 From d22867871676eedd7cc40e0c7d43bbded1f08212 Mon Sep 17 00:00:00 2001 From: momoma Date: Fri, 21 May 2021 10:17:12 +0900 Subject: [PATCH 10/10] Fixed serialization of Unity Object --- Editor/System/Filters/FilterByNameAndType.cs | 2 +- Editor/System/Model/SerializableMultiTargetInstance.cs | 6 ++++-- Editor/System/Model/SerializedInstance.cs | 9 ++++++--- Editor/System/Model/V2/ConfigGraph.cs | 4 ++++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Editor/System/Filters/FilterByNameAndType.cs b/Editor/System/Filters/FilterByNameAndType.cs index 03a61082..5ae4a465 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/Model/SerializableMultiTargetInstance.cs b/Editor/System/Model/SerializableMultiTargetInstance.cs index 605935a0..8a6f1231 100644 --- a/Editor/System/Model/SerializableMultiTargetInstance.cs +++ b/Editor/System/Model/SerializableMultiTargetInstance.cs @@ -159,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; @@ -206,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 aec7c2cf..a52fe3a0 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 bebc74a1..ba26e8ab 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(); }