From 98190ae3828831ea681562687de9c1de545ef711 Mon Sep 17 00:00:00 2001 From: DCFApixels <99481254+DCFApixels@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:05:29 +0800 Subject: [PATCH] add Manually serialize button for so --- src/Internal/Editor/EcsGUI.Layout.cs | 14 +++++++++++++ src/Internal/Editor/EcsGUI.cs | 12 +++++++++++ .../Editor/EntityTemplateEditor.cs | 9 +++++++++ .../Editor/PipelineTemplateEditor.cs | 20 +++++++++++++++---- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/Internal/Editor/EcsGUI.Layout.cs b/src/Internal/Editor/EcsGUI.Layout.cs index f924c73..799df86 100644 --- a/src/Internal/Editor/EcsGUI.Layout.cs +++ b/src/Internal/Editor/EcsGUI.Layout.cs @@ -16,6 +16,20 @@ namespace DCFApixels.DragonECS.Unity.Editors { public static partial class Layout { + + public static void ManuallySerializeButton(UnityObject obj) + { + if (GUILayout.Button(UnityEditorUtility.GetLabel("Manually serialize"))) + { + var so = new SerializedObject(obj); + EditorUtility.SetDirty(obj); + so.UpdateIfRequiredOrScript(); + so.ApplyModifiedProperties(); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + } + } + public static void ScriptAssetButton(MonoScript script, params GUILayoutOption[] options) { EcsGUI.ScriptAssetButton(GUILayoutUtility.GetRect(UnityEditorUtility.GetLabelTemp(), EditorStyles.miniButton, options), script); diff --git a/src/Internal/Editor/EcsGUI.cs b/src/Internal/Editor/EcsGUI.cs index aa91f42..9cf01be 100644 --- a/src/Internal/Editor/EcsGUI.cs +++ b/src/Internal/Editor/EcsGUI.cs @@ -758,6 +758,18 @@ namespace DCFApixels.DragonECS.Unity.Editors #endregion #region Other Elements + public static void ManuallySerializeButton(Rect position, UnityEngine.Object obj) + { + if (GUI.Button(position, UnityEditorUtility.GetLabel("Manually serialize"))) + { + var so = new SerializedObject(obj); + EditorUtility.SetDirty(obj); + so.UpdateIfRequiredOrScript(); + so.ApplyModifiedProperties(); + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + } + } public static bool AddComponentButton(Rect position, out Rect dropDownRect) { dropDownRect = RectUtility.AddPadding(position, 20f, 20f, 1f, 1f); ; diff --git a/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs b/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs index e6aa0d2..f2c59e3 100644 --- a/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs +++ b/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs @@ -16,6 +16,8 @@ namespace DCFApixels.DragonECS.Unity.Editors private SerializedProperty _componentsProp; private ReorderableList _reorderableComponentsList; + protected abstract bool IsSO { get; } + //public virtual bool IsStaticData { get { return false; } } #region Init @@ -161,6 +163,11 @@ namespace DCFApixels.DragonECS.Unity.Editors return; } + if (IsSO) + { + EcsGUI.Layout.ManuallySerializeButton(target); + } + if (IsMultipleTargets == false && SerializationUtility.HasManagedReferencesWithMissingTypes(target)) { using (EcsGUI.Layout.BeginHorizontal(EditorStyles.helpBox)) @@ -206,11 +213,13 @@ namespace DCFApixels.DragonECS.Unity.Editors internal class ScriptableEntityTemplateEditor : EntityTemplateEditorBase { //public override bool IsStaticData { get { return true; } } + protected override bool IsSO => true; } [CustomEditor(typeof(MonoEntityTemplate), true)] internal class MonoEntityTemplateEditor : EntityTemplateEditorBase { //public override bool IsStaticData { get { return false; } } + protected override bool IsSO => false; } } #endif diff --git a/src/Templates/PipelineTemplate/Editor/PipelineTemplateEditor.cs b/src/Templates/PipelineTemplate/Editor/PipelineTemplateEditor.cs index 9aea2bc..ff5e488 100644 --- a/src/Templates/PipelineTemplate/Editor/PipelineTemplateEditor.cs +++ b/src/Templates/PipelineTemplate/Editor/PipelineTemplateEditor.cs @@ -8,8 +8,7 @@ using UnityEngine; namespace DCFApixels.DragonECS.Unity.Editors { - [CustomEditor(typeof(ScriptablePipelineTemplate))] - internal class PipelineTemplateEditorBase : ExtendedEditor + internal abstract class PipelineTemplateEditorBase : ExtendedEditor { private SerializedProperty _parametersProp; private SerializedProperty _layersProp; @@ -23,6 +22,8 @@ namespace DCFApixels.DragonECS.Unity.Editors get => _reorderableLayersList != null && _reorderableRecordsList != null; } + protected abstract bool IsSO { get; } + protected override void OnStaticInit() { } protected override void OnInit() { @@ -143,6 +144,11 @@ namespace DCFApixels.DragonECS.Unity.Editors protected override void DrawCustom() { + if (IsSO) + { + EcsGUI.Layout.ManuallySerializeButton(target); + } + EcsGUI.Changed = GUILayout.Button("Validate"); DrawLayoutNameList(_layersProp); @@ -199,8 +205,14 @@ namespace DCFApixels.DragonECS.Unity.Editors } [CustomEditor(typeof(ScriptablePipelineTemplate), true)] - internal class ScriptablePipelineTemplateEditor : PipelineTemplateEditorBase { } + internal class ScriptablePipelineTemplateEditor : PipelineTemplateEditorBase + { + protected override bool IsSO => true; + } [CustomEditor(typeof(MonoPipelineTemplate), true)] - internal class MonoPipelineTemplateEditor : PipelineTemplateEditorBase { } + internal class MonoPipelineTemplateEditor : PipelineTemplateEditorBase + { + protected override bool IsSO => false; + } } #endif \ No newline at end of file