From 77e19b097b99217ac20b29578ff56ef77720e537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=93=AE?= <834207172@qq.com> Date: Wed, 30 Apr 2025 16:15:11 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90m=E3=80=91=E4=BF=AE=E6=94=B9=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E7=BB=84=E4=BB=B6=E5=AD=98=E5=82=A8=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RunTime/Abstract/AbstractInformation.cs | 141 +++++++++++++----- Assets/02.InformationSave/package.json | 2 +- 2 files changed, 101 insertions(+), 42 deletions(-) diff --git a/Assets/02.InformationSave/RunTime/Abstract/AbstractInformation.cs b/Assets/02.InformationSave/RunTime/Abstract/AbstractInformation.cs index dd0f603..12f8a31 100644 --- a/Assets/02.InformationSave/RunTime/Abstract/AbstractInformation.cs +++ b/Assets/02.InformationSave/RunTime/Abstract/AbstractInformation.cs @@ -26,6 +26,7 @@ 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); @@ -57,7 +58,12 @@ namespace Stary.Evo.InformationSave //更新 public void UpdateInformation() { - String sceneNmae = gameObject.scene.name; + string guid = GetPrefabGUID(this.gameObject)+GetPrefabHierarchyPath(this.gameObject); + if (guid == "") + { + UnityEditor.EditorUtility.DisplayDialog("错误", "可能存在错误\n1、无法在prefab预览中修改数据\n2、新增加物体需先同步为prefab", "确定"); + return; + } ScriptObjectSave scriptObjectSaveData = Resources.Load(path); if (scriptObjectSaveData == null) { @@ -65,14 +71,14 @@ namespace Stary.Evo.InformationSave return; } - if (scriptObjectSaveData.dic.ContainsKey(sceneNmae + gameObject.name)) + if (scriptObjectSaveData.dic.ContainsKey(guid)) { _list.Clear(); - _list = scriptObjectSaveData.dic[sceneNmae + gameObject.name].OfType().ToList(); + _list = scriptObjectSaveData.dic[guid].OfType().ToList(); } else { - Debug.LogError("UnityEvo:ScriptObjectSaveData中未存储场景:"+ sceneNmae + " 中物体:" + gameObject.name + "的数据!!!"); + Debug.LogError($"UnityEvo:ScriptObjectSaveData中未存储物体名为:{this.gameObject}\n guid为:{guid}的数据!!!"); } } @@ -80,49 +86,53 @@ namespace Stary.Evo.InformationSave public bool PlayingSave() { //文件保存 - if (Application.isEditor) + + string guid = GetPrefabGUID(this.gameObject)+GetPrefabHierarchyPath(this.gameObject); + if (guid == "") { - String sceneNmae = gameObject.scene.name; - // 加载 ScriptObjectSaveData - ScriptObjectSave scriptObjectSaveData = Resources.Load(path); - if(scriptObjectSaveData == null) - { - scriptObjectSaveData = CheckAndCreateFoldersAndAsset(); - //Debug.Log("创建了ScriptObjectSaveData文件"); - } + UnityEditor.EditorUtility.DisplayDialog("错误", "可能存在错误\n1、无法在prefab预览中修改数据\n2、新增加物体需先同步为prefab", "确定"); + return false; + } + // 加载 ScriptObjectSaveData + ScriptObjectSave scriptObjectSaveData = Resources.Load(path); + if (scriptObjectSaveData == null) + { + scriptObjectSaveData = CheckAndCreateFoldersAndAsset(); + //Debug.Log("创建了ScriptObjectSaveData文件"); + } - if (scriptObjectSaveData.dic == null) - { - Debug.LogError("UnityEvo:ScriptObjectSaveData的dic为空"); - return false; - } + if (scriptObjectSaveData.dic == null) + { + Debug.LogError("UnityEvo:ScriptObjectSaveData的dic为空"); + return false; + } - // 检查是否已经存在相同的键 - if (scriptObjectSaveData.dic.ContainsKey(sceneNmae + gameObject.name)) + // 检查是否已经存在相同的键 + if (scriptObjectSaveData.dic.ContainsKey(guid)) + { + // 如果存在,选择是否替换原有的 List + if (UnityEditor.EditorUtility.DisplayDialog("提示", + $"数据集下已有相同名称的物体数据\n是否覆盖更新!!!\n 物体名为:{this.gameObject}\n guid为:{guid}", "确定", + "取消")) { - // 如果存在,选择是否替换原有的 List - if (UnityEditor.EditorUtility.DisplayDialog("提示", "数据集下已有相同名称的物体数据\n是否覆盖更新!!!\n" + "场景名:" + sceneNmae + "\n物体名:" + gameObject.name, "确定", "取消")) - { - scriptObjectSaveData.dic[sceneNmae + gameObject.name] = new List(_list); - } - else - { - return false; - } + scriptObjectSaveData.dic[guid] = new List(_list); } else { - // 如果不存在,添加新的键值对 - scriptObjectSaveData.dic.Add(sceneNmae + gameObject.name, new List(_list)); + return false; } - AssetDatabase.SaveAssets(); - EditorUtility.SetDirty(scriptObjectSaveData); - AssetDatabase.Refresh(); - - return true; + } + else + { + // 如果不存在,添加新的键值对 + scriptObjectSaveData.dic.Add(guid, new List(_list)); } - return false; + AssetDatabase.SaveAssets(); + EditorUtility.SetDirty(scriptObjectSaveData); + AssetDatabase.Refresh(); + + return true; } private ScriptObjectSave CheckAndCreateFoldersAndAsset() @@ -148,17 +158,19 @@ namespace Stary.Evo.InformationSave // 创建ScriptObjectSaveData.asset文件 scriptableObject = ScriptableObject.CreateInstance(); - AssetDatabase.CreateAsset(scriptableObject, "Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" + ScriptObjectSaveDataFileName + ".asset"); + AssetDatabase.CreateAsset(scriptableObject, + "Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" + + ScriptObjectSaveDataFileName + ".asset"); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); - Debug.Log("UnityEvo:创建了: " + "Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" + ScriptObjectSaveDataFileName + ".asset 资产"); + Debug.Log("UnityEvo:创建了: " + "Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" + + ScriptObjectSaveDataFileName + ".asset 资产"); return scriptableObject; } //绘制 public override void Draw() { - int length = _list.Count; int deleteIndex = -1; for (int i = 0; i < length; i++) @@ -209,7 +221,53 @@ 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 @@ -217,6 +275,7 @@ namespace Stary.Evo.InformationSave #endregion + [System.Serializable] public class InformationBase { diff --git a/Assets/02.InformationSave/package.json b/Assets/02.InformationSave/package.json index 9be7c4b..44f03a6 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.3", + "version": "1.0.4", "description": "位置配置工具", "unity": "2021.3", "unityRelease": "30f1",