From 5e41d558ca01d46579cb98a9599319acfad6dee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=93=AE?= <834207172@qq.com> Date: Thu, 8 May 2025 15:57:40 +0800 Subject: [PATCH] =?UTF-8?q?02=20=E4=BD=8D=E7=BD=AE=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/CustomEditorBaseEditor.cs | 19 ++ .../RunTime/Abstract/AbstractInformation.cs | 192 +++--------------- .../RunTime/Base/CustomEditorBase.cs | 5 +- Assets/02.InformationSave/RunTime/Data.meta | 3 - .../RunTime/Data/ScriptObjectSave.cs | 16 -- .../RunTime/Data/ScriptObjectSave.cs.meta | 11 - .../RunTime/Data/ScriptObjectSaveData.asset | 43 ---- .../Data/ScriptObjectSaveData.asset.meta | 8 - Assets/02.InformationSave/package.json | 2 +- 9 files changed, 52 insertions(+), 247 deletions(-) delete mode 100644 Assets/02.InformationSave/RunTime/Data.meta delete mode 100644 Assets/02.InformationSave/RunTime/Data/ScriptObjectSave.cs delete mode 100644 Assets/02.InformationSave/RunTime/Data/ScriptObjectSave.cs.meta delete mode 100644 Assets/02.InformationSave/RunTime/Data/ScriptObjectSaveData.asset delete mode 100644 Assets/02.InformationSave/RunTime/Data/ScriptObjectSaveData.asset.meta diff --git a/Assets/02.InformationSave/Editor/CustomEditorBaseEditor.cs b/Assets/02.InformationSave/Editor/CustomEditorBaseEditor.cs index 65224ad..6b8900e 100644 --- a/Assets/02.InformationSave/Editor/CustomEditorBaseEditor.cs +++ b/Assets/02.InformationSave/Editor/CustomEditorBaseEditor.cs @@ -1,6 +1,8 @@ +using System; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; +using Object = UnityEngine.Object; namespace Stary.Evo.InformationSave { @@ -9,16 +11,33 @@ namespace Stary.Evo.InformationSave { private CustomEditorBase _customEditorBase; + public override void OnInspectorGUI() { base.OnInspectorGUI(); serializedObject.Update(); _customEditorBase = target as CustomEditorBase; + + if (string.IsNullOrEmpty(_customEditorBase.mationID)) + { + _customEditorBase.mationID = _customEditorBase.gameObject.GetInstanceID().ToString(); + } + GUILayout.BeginHorizontal(); + GUILayout.Box("MationID:", GUILayout.MaxWidth(500)); + GUILayout.Box(_customEditorBase.mationID, GUILayout.MaxWidth(500)); + GUILayout.EndHorizontal(); + _customEditorBase.Draw(); //这个函数告诉引擎,相关对象所属于的Prefab已经发生了更改。方便,当我们更改了自定义对象的属性的时候,自动更新到所属的Prefab中 if (GUI.changed && EditorApplication.isPlaying == false) { serializedObject.ApplyModifiedProperties(); + + var prefabType = PrefabUtility.GetPrefabInstanceStatus(_customEditorBase); + if (prefabType != PrefabInstanceStatus.NotAPrefab) + { + PrefabUtility.RecordPrefabInstancePropertyModifications(_customEditorBase); + } EditorUtility.SetDirty(_customEditorBase); EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); } diff --git a/Assets/02.InformationSave/RunTime/Abstract/AbstractInformation.cs b/Assets/02.InformationSave/RunTime/Abstract/AbstractInformation.cs index 12f8a31..5e356ed 100644 --- a/Assets/02.InformationSave/RunTime/Abstract/AbstractInformation.cs +++ b/Assets/02.InformationSave/RunTime/Abstract/AbstractInformation.cs @@ -1,22 +1,17 @@ using System; using System.Collections.Generic; using System.IO; -using System.Threading.Tasks; using Newtonsoft.Json; -using UnityEditor; using UnityEngine; -using System.Linq; namespace Stary.Evo.InformationSave { public abstract class AbstractInformation : CustomEditorBase where T : InformationBase, new() { + [HideInInspector] public List _list = new List(); - /// - /// 配置文件存储路径 - /// - string path = "InformationSaveData/ScriptObjectSaveData"; + public virtual void Add() { @@ -27,20 +22,6 @@ namespace Stary.Evo.InformationSave public abstract void Save(int index); public abstract void Switch(int index); - public virtual T GetTransform(string desc) - { - int index = _list.FindIndex(n => n.desc == desc); - if (index != -1) - { - return _list[index]; - } - else - { - Debug.LogError($"UnityEvo:{typeof(T)}:不存在该信息:" + desc); - return default(T); - } - } - public virtual void Delete(int index) { _list.RemoveAt(index); @@ -55,117 +36,49 @@ namespace Stary.Evo.InformationSave #region Editor #if UNITY_EDITOR + private string _path; + private string _directoryPath; + + private void SetPath() + { + _directoryPath = Application.persistentDataPath + "/Ignore"; + _path = _directoryPath + "/" + mationID; + } + //更新 public void UpdateInformation() { - string guid = GetPrefabGUID(this.gameObject)+GetPrefabHierarchyPath(this.gameObject); - if (guid == "") + SetPath(); + if (File.Exists(_path) == false) { - UnityEditor.EditorUtility.DisplayDialog("错误", "可能存在错误\n1、无法在prefab预览中修改数据\n2、新增加物体需先同步为prefab", "确定"); - return; - } - ScriptObjectSave scriptObjectSaveData = Resources.Load(path); - if (scriptObjectSaveData == null) - { - Debug.LogError("UnityEvo:ScriptObjectSaveData配置文件丢失"); + Debug.LogError("不存在更新文件:" + _path); return; } - if (scriptObjectSaveData.dic.ContainsKey(guid)) + var json = File.ReadAllText(_path); + List tempList = JsonConvert.DeserializeObject>(json); + if (tempList != null && tempList.Count > 0) { _list.Clear(); - _list = scriptObjectSaveData.dic[guid].OfType().ToList(); - } - else - { - Debug.LogError($"UnityEvo:ScriptObjectSaveData中未存储物体名为:{this.gameObject}\n guid为:{guid}的数据!!!"); + _list.AddRange(tempList); + Debug.Log("更新成功!"); } } //动态保存 public bool PlayingSave() { - //文件保存 - - string guid = GetPrefabGUID(this.gameObject)+GetPrefabHierarchyPath(this.gameObject); - if (guid == "") + if (UnityEditor.EditorApplication.isPlaying) { - UnityEditor.EditorUtility.DisplayDialog("错误", "可能存在错误\n1、无法在prefab预览中修改数据\n2、新增加物体需先同步为prefab", "确定"); - return false; - } - // 加载 ScriptObjectSaveData - ScriptObjectSave scriptObjectSaveData = Resources.Load(path); - if (scriptObjectSaveData == null) - { - scriptObjectSaveData = CheckAndCreateFoldersAndAsset(); - //Debug.Log("创建了ScriptObjectSaveData文件"); + SetPath(); + if (Directory.Exists(_directoryPath) == false) Directory.CreateDirectory(_directoryPath); + var json = JsonConvert.SerializeObject(_list); + File.WriteAllText(_path,json); + Debug.Log("动态保存成功!"); + return true; } - if (scriptObjectSaveData.dic == null) - { - Debug.LogError("UnityEvo:ScriptObjectSaveData的dic为空"); - return false; - } - - // 检查是否已经存在相同的键 - if (scriptObjectSaveData.dic.ContainsKey(guid)) - { - // 如果存在,选择是否替换原有的 List - if (UnityEditor.EditorUtility.DisplayDialog("提示", - $"数据集下已有相同名称的物体数据\n是否覆盖更新!!!\n 物体名为:{this.gameObject}\n guid为:{guid}", "确定", - "取消")) - { - scriptObjectSaveData.dic[guid] = new List(_list); - } - else - { - return false; - } - } - else - { - // 如果不存在,添加新的键值对 - scriptObjectSaveData.dic.Add(guid, new List(_list)); - } - - AssetDatabase.SaveAssets(); - EditorUtility.SetDirty(scriptObjectSaveData); - AssetDatabase.Refresh(); - - return true; - } - - private ScriptObjectSave CheckAndCreateFoldersAndAsset() - { - string ResourcesFolderName = "Resources"; - string InformationSaveDataFolderName = "InformationSaveData"; - string ScriptObjectSaveDataFileName = "ScriptObjectSaveData"; - ScriptObjectSave scriptableObject; - - // 判断是否创建Resources文件夹 - string resourcesPath = Path.Combine(Application.dataPath, ResourcesFolderName); - if (!Directory.Exists(resourcesPath)) - { - Directory.CreateDirectory(resourcesPath); - } - - // 判断是否创建InformationSaveData文件夹 - string informationSaveDataPath = Path.Combine(resourcesPath, InformationSaveDataFolderName); - if (!Directory.Exists(informationSaveDataPath)) - { - Directory.CreateDirectory(informationSaveDataPath); - } - - // 创建ScriptObjectSaveData.asset文件 - scriptableObject = ScriptableObject.CreateInstance(); - AssetDatabase.CreateAsset(scriptableObject, - "Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" + - ScriptObjectSaveDataFileName + ".asset"); - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - Debug.Log("UnityEvo:创建了: " + "Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" + - ScriptObjectSaveDataFileName + ".asset 资产"); - return scriptableObject; + return false; } //绘制 @@ -181,7 +94,7 @@ namespace Stary.Evo.InformationSave if (GUILayout.Button("保存")) { Save(i); - if (PlayingSave()) Debug.Log("UnityEvo:保存成功!"); + if (PlayingSave() == false) Debug.Log("保存成功!"); } if (GUILayout.Button("上移") && i > 0) @@ -220,54 +133,6 @@ namespace Stary.Evo.InformationSave GUILayout.EndHorizontal(); } - - private string GetCurrentGUID() - { - string assetPath = AssetDatabase.GetAssetPath(this); - if (!string.IsNullOrEmpty(assetPath)) - { - return AssetDatabase.AssetPathToGUID(assetPath); - } - - return string.Empty; - } - - private string GetPrefabGUID(GameObject obj) - { - string assetPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(obj); - Debug.Log("UnityEvo:GetPrefabHierarchyPath:" + GetPrefabHierarchyPath(obj)); - - if (!string.IsNullOrEmpty(assetPath)) - { - return AssetDatabase.AssetPathToGUID(assetPath); - } - - return string.Empty; - } - - - private string GetPrefabHierarchyPath(GameObject obj) - { - var path = new System.Text.StringBuilder(); - var current = obj.transform; - //检测该预制体是否是实例 - var root = PrefabUtility.GetNearestPrefabInstanceRoot(obj); - if (root != null) - { - while (current != null && current != root.transform) - { - path.Insert(0, current.name); - path.Insert(0, "/"); - current = current.parent; - } - - - return path.ToString(); - } - - return string.Empty; - } - #else public override void Draw(){} #endif @@ -275,7 +140,6 @@ namespace Stary.Evo.InformationSave #endregion - [System.Serializable] public class InformationBase { diff --git a/Assets/02.InformationSave/RunTime/Base/CustomEditorBase.cs b/Assets/02.InformationSave/RunTime/Base/CustomEditorBase.cs index 7d2901a..dc09f39 100644 --- a/Assets/02.InformationSave/RunTime/Base/CustomEditorBase.cs +++ b/Assets/02.InformationSave/RunTime/Base/CustomEditorBase.cs @@ -1,9 +1,12 @@ +using Unity.Collections; using UnityEngine; namespace Stary.Evo.InformationSave { public abstract class CustomEditorBase : MonoBehaviour { + [HideInInspector] + public string mationID; public abstract void Draw(); } -} \ No newline at end of file +} \ No newline at end of file diff --git a/Assets/02.InformationSave/RunTime/Data.meta b/Assets/02.InformationSave/RunTime/Data.meta deleted file mode 100644 index 12f1bea..0000000 --- a/Assets/02.InformationSave/RunTime/Data.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6543baeed3e940268fc41b7eb6fa31a7 -timeCreated: 1735626715 \ No newline at end of file diff --git a/Assets/02.InformationSave/RunTime/Data/ScriptObjectSave.cs b/Assets/02.InformationSave/RunTime/Data/ScriptObjectSave.cs deleted file mode 100644 index a633d6c..0000000 --- a/Assets/02.InformationSave/RunTime/Data/ScriptObjectSave.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using Stary.Evo.InformationSave; -using UnityEditor; -using UnityEngine; -using Sirenix.OdinInspector; - -namespace Stary.Evo.InformationSave -{ - [CreateAssetMenu()] - public class ScriptObjectSave : SerializedScriptableObject - { - public Dictionary> dic = new Dictionary>(); - } -} \ No newline at end of file diff --git a/Assets/02.InformationSave/RunTime/Data/ScriptObjectSave.cs.meta b/Assets/02.InformationSave/RunTime/Data/ScriptObjectSave.cs.meta deleted file mode 100644 index 5c75a84..0000000 --- a/Assets/02.InformationSave/RunTime/Data/ScriptObjectSave.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a08c59ee0e6844441825e5b5427d1e4c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/02.InformationSave/RunTime/Data/ScriptObjectSaveData.asset b/Assets/02.InformationSave/RunTime/Data/ScriptObjectSaveData.asset deleted file mode 100644 index bf306f0..0000000 --- a/Assets/02.InformationSave/RunTime/Data/ScriptObjectSaveData.asset +++ /dev/null @@ -1,43 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a08c59ee0e6844441825e5b5427d1e4c, type: 3} - m_Name: ScriptObjectSaveData - m_EditorClassIdentifier: - serializationData: - SerializedFormat: 2 - SerializedBytes: - ReferencedUnityObjects: [] - SerializedBytesString: - Prefab: {fileID: 0} - PrefabModificationsReferencedUnityObjects: [] - PrefabModifications: [] - SerializationNodes: - - Name: dic - Entry: 7 - Data: 0|System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Collections.Generic.List`1[[Stary.Evo.InformationSave.InformationBase, - Assembly-CSharp]], mscorlib]], mscorlib - - Name: comparer - Entry: 7 - Data: 1|System.Collections.Generic.GenericEqualityComparer`1[[System.String, - mscorlib]], mscorlib - - Name: - Entry: 8 - Data: - - Name: - Entry: 12 - Data: 0 - - Name: - Entry: 13 - Data: - - Name: - Entry: 8 - Data: diff --git a/Assets/02.InformationSave/RunTime/Data/ScriptObjectSaveData.asset.meta b/Assets/02.InformationSave/RunTime/Data/ScriptObjectSaveData.asset.meta deleted file mode 100644 index 87cf931..0000000 --- a/Assets/02.InformationSave/RunTime/Data/ScriptObjectSaveData.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8e2aa5a2cf392c145a1055e82ed08b6f -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/02.InformationSave/package.json b/Assets/02.InformationSave/package.json index 44f03a6..1b159b2 100644 --- a/Assets/02.InformationSave/package.json +++ b/Assets/02.InformationSave/package.json @@ -1,7 +1,7 @@ { "name": "com.staryevo.informationsave", "displayName": "02.InformationSave", - "version": "1.0.4", + "version": "1.0.5", "description": "位置配置工具", "unity": "2021.3", "unityRelease": "30f1",