From 776648a9933411af9f45de5f1ec7669cace03a1c Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Mon, 30 Sep 2024 19:40:50 +0800 Subject: [PATCH] stash --- src/RefRepairer/Editor/RefRepairerWindow.cs | 2 +- src/RefRepairer/MetaIDRegistry.cs | 34 ++++- ...Utility.cs => MissingRefCollectUtility.cs} | 143 +++++++++--------- ....meta => MissingRefCollectUtility.cs.meta} | 0 src/RefRepairer/RepairerFile.cs | 13 +- ...issingTypes.cs => ContainerMissingRefs.cs} | 10 +- ...s.cs.meta => ContainerMissingRefs.cs.meta} | 0 7 files changed, 120 insertions(+), 82 deletions(-) rename src/RefRepairer/{MissingRefUtility.cs => MissingRefCollectUtility.cs} (51%) rename src/RefRepairer/{MissingRefUtility.cs.meta => MissingRefCollectUtility.cs.meta} (100%) rename src/RefRepairer/Utils/{ContainerMissingTypes.cs => ContainerMissingRefs.cs} (54%) rename src/RefRepairer/Utils/{ContainerMissingTypes.cs.meta => ContainerMissingRefs.cs.meta} (100%) diff --git a/src/RefRepairer/Editor/RefRepairerWindow.cs b/src/RefRepairer/Editor/RefRepairerWindow.cs index 2e84d86..3c50c4b 100644 --- a/src/RefRepairer/Editor/RefRepairerWindow.cs +++ b/src/RefRepairer/Editor/RefRepairerWindow.cs @@ -20,7 +20,7 @@ namespace DCFApixels.DragonECS.Unity.Editors wnd.Show(); } - private List _missingTypes; + private List _missingTypes; //private readonly CollectorMissingTypes _collectorMissingTypes = new CollectorMissingTypes(); private bool TryInit() diff --git a/src/RefRepairer/MetaIDRegistry.cs b/src/RefRepairer/MetaIDRegistry.cs index 3576c5d..1bc7210 100644 --- a/src/RefRepairer/MetaIDRegistry.cs +++ b/src/RefRepairer/MetaIDRegistry.cs @@ -3,6 +3,7 @@ using DCFApixels.DragonECS.Unity.Editors; using DCFApixels.DragonECS.Unity.RefRepairer.Internal; using System; using System.Collections.Generic; +using System.Text; using UnityEditor; using UnityEngine; @@ -56,14 +57,38 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors private void Update() { var typeMetas = UnityEditorUtility._serializableTypeWithMetaIDMetas; - + StringBuilder sb = null; foreach (var meta in typeMetas) { var type = meta.Type; - var key = new TypeData(type.Name, type.Namespace, type.Assembly.FullName); + string name = null; + if (type.DeclaringType == null) + { + name = type.Name; + } + else + { + Type iteratorType = type; + if (sb == null) + { + sb = new StringBuilder(); + } + sb.Clear(); + sb.Append(iteratorType.Name); + while ((iteratorType = iteratorType.DeclaringType) != null) + { + sb.Insert(0, '/'); + sb.Insert(0, iteratorType.Name); + } + name = sb.ToString(); + } + + var key = new TypeData(name, type.Namespace, type.Assembly.GetName().Name); var metaID = meta.MetaID; - if (_typeKeyMetaIDPairs.TryGetValue(key, out string keyMetaID) == false) + //Debug.LogWarning(type + " " + metaID); + + if (_typeKeyMetaIDPairs.TryGetValue(key, out string keyMetaID)) { if (keyMetaID != metaID) { @@ -77,11 +102,10 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors _isChanged = true; } } - if (_isChanged) { - EditorUtility.SetDirty(this); _isChanged = false; + EditorUtility.SetDirty(this); Save(true); } } diff --git a/src/RefRepairer/MissingRefUtility.cs b/src/RefRepairer/MissingRefCollectUtility.cs similarity index 51% rename from src/RefRepairer/MissingRefUtility.cs rename to src/RefRepairer/MissingRefCollectUtility.cs index c5c93b5..e614fdb 100644 --- a/src/RefRepairer/MissingRefUtility.cs +++ b/src/RefRepairer/MissingRefCollectUtility.cs @@ -1,4 +1,4 @@ -using DCFApixels.DragonECS.Unity.RefRepairer.Internal; +#if UNITY_EDITOR using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -10,7 +10,7 @@ using UnityObject = UnityEngine.Object; namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors { - public static class UnityObjectExtensions + internal static class UnityObjectExtensions { public static int GetLocalIdentifierInFile(this UnityObject unityObject) { @@ -22,111 +22,111 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors } } - internal class MissingRefUtility + internal class ContainerMissingTypes { - private readonly Dictionary _missingTypes = new Dictionary(); + public readonly GUID AssetGUID; + public readonly List Recirds = new List(); + public ContainerMissingTypes(GUID assetGUID) + { + AssetGUID = assetGUID; + } + } + internal class MissingRefCollectUtility + { + //private readonly Dictionary _manualRepairedMissingRefs = new Dictionary(); + //private readonly List _autoRepariedMissingTypes = new List(); + + private readonly List _collectedMissingTypes = new List(); #region Collect - public List Collect() + public List Collect() { - _missingTypes.Clear(); + //_manualRepairedMissingRefs.Clear(); + + _collectedMissingTypes.Clear(); - CollectByPrefabs(); - CollectByScriptableObjects(); - CollectByScenes(); + CollectByPrefabs(_collectedMissingTypes); + CollectByScriptableObjects(_collectedMissingTypes); + CollectByScenes(_collectedMissingTypes); - List result = new List(_missingTypes.Select((typeAndContainer) => typeAndContainer.Value)); - _missingTypes.Clear(); - return result; + //ContainerMissingRefs[] result = _manualRepairedMissingRefs.Values.ToArray(); + //_manualRepairedMissingRefs.Clear(); + + return _collectedMissingTypes; } - private void CollectByPrefabs() + public readonly struct Record + { + public readonly UnityObjectDataBase UnityObject; + public readonly ManagedReferenceMissingType[] missingTypes; + public Record(UnityObjectDataBase unityObject, ManagedReferenceMissingType[] missingTypes) + { + UnityObject = unityObject; + this.missingTypes = missingTypes; + } + } + private void CollectByPrefabs(List list) { Scene previewScene = EditorSceneManager.NewPreviewScene(); - foreach (var pathToPrefab in AssetDatabase.GetAllAssetPaths().Where(path => path.StartsWith("Assets/") && path.EndsWith(".prefab"))) { - var prefab = AssetDatabase.LoadAssetAtPath(pathToPrefab); + var prefabAsset = AssetDatabase.LoadAssetAtPath(pathToPrefab); + var unityObjectData = new UnityObjectData(prefabAsset, pathToPrefab); + PrefabUtility.LoadPrefabContentsIntoPreviewScene(pathToPrefab, previewScene); - var copyPrefab = previewScene.GetRootGameObjects()[0]; + var prefabLoaded = previewScene.GetRootGameObjects()[0]; - var componentsPrefab = prefab.GetComponentsInChildren(); - var componentsCopyPrefab = copyPrefab.GetComponentsInChildren(); - - for (int i = 0; i < componentsCopyPrefab.Length; ++i) + foreach (var component in prefabLoaded.GetComponentsInChildren()) { - var monoBehaviour = componentsCopyPrefab[i]; - if (SerializationUtility.HasManagedReferencesWithMissingTypes(monoBehaviour) == false) - { - continue; - } + if (SerializationUtility.HasManagedReferencesWithMissingTypes(component) == false) { continue; } - foreach (var missingType in SerializationUtility.GetManagedReferencesWithMissingTypes(monoBehaviour)) - { - var prefabObject = new UnityObjectData(componentsPrefab[i].gameObject, pathToPrefab); - - AddMissingType(missingType, prefabObject); - } + var missings = SerializationUtility.GetManagedReferencesWithMissingTypes(component); + list.Add(new Record(unityObjectData, missings)); } - UnityObject.DestroyImmediate(copyPrefab); + UnityObject.DestroyImmediate(prefabLoaded); } - EditorSceneManager.ClosePreviewScene(previewScene); } - private void CollectByScriptableObjects() + private void CollectByScriptableObjects(List list) { foreach (var pathToPrefab in AssetDatabase.GetAllAssetPaths().Where(path => path.StartsWith("Assets/") && path.EndsWith(".asset"))) { var scriptableObject = AssetDatabase.LoadAssetAtPath(pathToPrefab); + var unityObjectData = new UnityObjectData(scriptableObject, pathToPrefab); - if (SerializationUtility.HasManagedReferencesWithMissingTypes(scriptableObject) == false) - { - continue; - } + if (SerializationUtility.HasManagedReferencesWithMissingTypes(scriptableObject) == false) { continue; } - foreach (var missingType in SerializationUtility.GetManagedReferencesWithMissingTypes(scriptableObject)) - { - var prefabObject = new UnityObjectData(scriptableObject, pathToPrefab); - AddMissingType(missingType, prefabObject); - } + var missings = SerializationUtility.GetManagedReferencesWithMissingTypes(scriptableObject); + list.Add(new Record(unityObjectData, missings)); } } - private void CollectByScenes() + private void CollectByScenes(List list) { try { foreach (var scene in GetAllScenesInAssets()) { + var unityObjectData = new SceneObjectData(scene); + var gameObjects = scene.GetRootGameObjects(); foreach (var objectOnScene in gameObjects) { foreach (var monoBehaviour in objectOnScene.GetComponentsInChildren()) { - if (SerializationUtility.HasManagedReferencesWithMissingTypes(monoBehaviour) == false) - { - continue; - } + if (SerializationUtility.HasManagedReferencesWithMissingTypes(monoBehaviour) == false) { continue; } - foreach (var missingType in SerializationUtility.GetManagedReferencesWithMissingTypes(monoBehaviour)) - { - var sceneObject = new SceneObjectData(scene); - AddMissingType(missingType, sceneObject); - } + var missings = SerializationUtility.GetManagedReferencesWithMissingTypes(monoBehaviour); + list.Add(new Record(unityObjectData, missings)); } } } } catch (System.Exception e) { - Debug.LogException(e); } - - - - // SerializationUtility. } #endregion @@ -164,19 +164,20 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors } } - private void AddMissingType(ManagedReferenceMissingType missingType, UnityObjectDataBase unityObject) - { - var typeData = new TypeData(missingType); - var missingTypeData = new MissingTypeData(missingType, unityObject); - if (_missingTypes.TryGetValue(typeData, out var containerMissingTypes) == false) - { - containerMissingTypes = new ContainerMissingTypes(typeData); - _missingTypes.Add(typeData, containerMissingTypes); - } - - containerMissingTypes.ManagedReferencesMissingTypeDatas.Add(missingTypeData); - } + //private void AddMissingType(ManagedReferenceMissingType missingType, UnityObjectDataBase unityObject) + //{ + // var typeData = new TypeData(missingType); + // var missingTypeData = new MissingTypeData(missingType, unityObject); + // if (_manualRepairedMissingRefs.TryGetValue(typeData, out var containerMissingTypes) == false) + // { + // containerMissingTypes = new ContainerMissingRefs(typeData); + // _manualRepairedMissingRefs.Add(typeData, containerMissingTypes); + // } + // + // containerMissingTypes.ManagedReferencesMissingTypeDatas.Add(missingTypeData); + //} #endregion } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/RefRepairer/MissingRefUtility.cs.meta b/src/RefRepairer/MissingRefCollectUtility.cs.meta similarity index 100% rename from src/RefRepairer/MissingRefUtility.cs.meta rename to src/RefRepairer/MissingRefCollectUtility.cs.meta diff --git a/src/RefRepairer/RepairerFile.cs b/src/RefRepairer/RepairerFile.cs index 647eeca..85e4279 100644 --- a/src/RefRepairer/RepairerFile.cs +++ b/src/RefRepairer/RepairerFile.cs @@ -6,7 +6,7 @@ using UnityEngine; namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors { - internal static class FileRepaireUtility + internal static class RepaireFileUtility { private const string REFLINE_PATTERN = "- rid:"; public static void Replace(string[] fileLines, string oldTypeData, string newTypeData) @@ -19,6 +19,17 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors } } } + public static int NextRefLine(string[] fileLines, int startIndex) + { + for (int i = startIndex; i < fileLines.Length; i++) + { + if (fileLines[i].Contains(REFLINE_PATTERN)) + { + return ++i; + } + } + return -1; + } public static string GenerateReplacedLine(TypeData typeData) { return $"type: {{class: {typeData.ClassName}, ns: {typeData.NamespaceName}, asm: {typeData.AssemblyName}}}"; diff --git a/src/RefRepairer/Utils/ContainerMissingTypes.cs b/src/RefRepairer/Utils/ContainerMissingRefs.cs similarity index 54% rename from src/RefRepairer/Utils/ContainerMissingTypes.cs rename to src/RefRepairer/Utils/ContainerMissingRefs.cs index 4785701..d8d52f1 100644 --- a/src/RefRepairer/Utils/ContainerMissingTypes.cs +++ b/src/RefRepairer/Utils/ContainerMissingRefs.cs @@ -4,15 +4,17 @@ using System.Collections.Generic; namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors { - internal class ContainerMissingTypes + internal class ContainerMissingRefs { public readonly TypeData TypeData; public readonly string ReplacedLine; - public readonly List ManagedReferencesMissingTypeDatas = new List(); - public ContainerMissingTypes(TypeData typeData) + public readonly List ManagedReferencesMissingTypeDatas = new List(4); + public readonly bool IsHasMetaIDRegistry; + public ContainerMissingRefs(TypeData typeData) { TypeData = typeData; - ReplacedLine = FileRepaireUtility.GenerateReplacedLine(typeData); + ReplacedLine = RepaireFileUtility.GenerateReplacedLine(typeData); + IsHasMetaIDRegistry = MetaIDRegistry.instance.TryGetMetaID(TypeData, out _); } } } diff --git a/src/RefRepairer/Utils/ContainerMissingTypes.cs.meta b/src/RefRepairer/Utils/ContainerMissingRefs.cs.meta similarity index 100% rename from src/RefRepairer/Utils/ContainerMissingTypes.cs.meta rename to src/RefRepairer/Utils/ContainerMissingRefs.cs.meta