diff --git a/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs b/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs index 2486406..fd5792c 100644 --- a/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs +++ b/src/Templates/EntityTemplate/Editor/EntityTemplateEditor.cs @@ -67,6 +67,7 @@ namespace DCFApixels.DragonECS.Unity.Editors if (componentProperty == null) { + //Debug.Log(prop.displayName); throw new NullReferenceException(); } } diff --git a/src/Templates/EntityTemplate/Templates/ScriptableEntityTemplate.cs b/src/Templates/EntityTemplate/Templates/ScriptableEntityTemplate.cs index 40a3cbc..6753410 100644 --- a/src/Templates/EntityTemplate/Templates/ScriptableEntityTemplate.cs +++ b/src/Templates/EntityTemplate/Templates/ScriptableEntityTemplate.cs @@ -47,7 +47,7 @@ namespace DCFApixels.DragonECS if (_components == null) { return; } foreach (var item in _components) { - item.OnValidate(this); + item?.OnValidate(this); } } #endregion diff --git a/src/Tools/RefRepairer/Editor/RefRepairerWindow.cs b/src/Tools/RefRepairer/Editor/RefRepairerWindow.cs index e6941bd..8db24f0 100644 --- a/src/Tools/RefRepairer/Editor/RefRepairerWindow.cs +++ b/src/Tools/RefRepairer/Editor/RefRepairerWindow.cs @@ -160,6 +160,15 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors } using (EcsGUI.Layout.BeginVertical(_panel)) { + if (_missingRefContainer != null) + { + Debug.Log(_missingRefContainer.IsEmptyX); + } + else + { + Debug.Log("NULL"); + } + const string LIST_EMPTY_MESSAGE = "List of Missings is Empty"; const string COLLECT_BUTTON = "Collect Missings"; if (_missingRefContainer.IsEmpty) @@ -287,6 +296,11 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors { _selectedMissingsResolvingData = null; RepaireFileUtility.RepaieAsset(_missingRefContainer); + if (_missingRefContainer.IsEmpty) + { + _isNoFound = true; + MetaIDRegistry.instance.Reinit(); + } } } } diff --git a/src/Tools/RefRepairer/MissingRefContainer.cs b/src/Tools/RefRepairer/MissingRefContainer.cs index d609dd1..25cd64b 100644 --- a/src/Tools/RefRepairer/MissingRefContainer.cs +++ b/src/Tools/RefRepairer/MissingRefContainer.cs @@ -15,6 +15,7 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors { internal class MissingRefContainer { + // обязательно распологать так чтобы записи сссылающиеся на один и тот же ассет шли подряд друг за другом public CollectedAssetMissingRecord[] collectedMissingTypesBuffer = null; public int collectedMissingTypesBufferCount = 0; public readonly Dictionary MissingsResolvingDatas = new Dictionary(); @@ -22,6 +23,10 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors { get { return collectedMissingTypesBufferCount == 0; } } + public int IsEmptyX + { + get { return collectedMissingTypesBufferCount; } + } #region Clear/RemoveResolved public void Clear() @@ -35,53 +40,57 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors } public void RemoveResolved() { - int offset = 0; - int i = 0; - int newLength = collectedMissingTypesBufferCount; - bool isReturn = true; - for (; i < newLength; i++) + int startI = 0; + int newCollectedMissingTypesBufferCount = collectedMissingTypesBufferCount; + bool isNoResolved = true; + // тут проверяется что есть разрешенные миссинги + // или просто скипается часть с не разрешенными миссингами + for (; startI < collectedMissingTypesBufferCount; startI++) { - ref var collectedMissingType = ref collectedMissingTypesBuffer[i]; + ref var collectedMissingType = ref collectedMissingTypesBuffer[startI]; if (collectedMissingType.IsResolvedOrNull) { if (collectedMissingType.ResolvingData != null) { MissingsResolvingDatas.Remove(collectedMissingType.ResolvingData.OldTypeData); } - offset = 1; - newLength--; - isReturn = false; + newCollectedMissingTypesBufferCount--; + isNoResolved = false; break; } } - if (isReturn) { return; } + if (isNoResolved) { return; } + // тут один разрешенный миссинг уже найден - int nextI = i + offset; - for (; nextI < newLength; nextI++) + int nextI = startI + 1; + for (; nextI < collectedMissingTypesBufferCount;) { - ref var collectedMissingType = ref collectedMissingTypesBuffer[i]; + ref var collectedMissingType = ref collectedMissingTypesBuffer[nextI]; if (collectedMissingType.IsResolvedOrNull) { if (collectedMissingType.ResolvingData != null) { MissingsResolvingDatas.Remove(collectedMissingType.ResolvingData.OldTypeData); } - offset++; - newLength--; + newCollectedMissingTypesBufferCount--; + nextI++; } else { - collectedMissingTypesBuffer[i] = collectedMissingTypesBuffer[nextI]; - i++; + collectedMissingTypesBuffer[startI] = collectedMissingTypesBuffer[nextI]; + startI++; + nextI++; } } - for (i = newLength; i < collectedMissingTypesBufferCount; i++) + + //очистка хвостовой части откуда все уехало + for (startI = newCollectedMissingTypesBufferCount; startI < collectedMissingTypesBufferCount; startI++) { - collectedMissingTypesBuffer[i] = default; + collectedMissingTypesBuffer[startI] = default; } - collectedMissingTypesBufferCount = newLength; + collectedMissingTypesBufferCount = newCollectedMissingTypesBufferCount; } #endregion diff --git a/src/Tools/RefRepairer/RepaireFileUtility.cs b/src/Tools/RefRepairer/RepaireFileUtility.cs index eaf6f8d..e951212 100644 --- a/src/Tools/RefRepairer/RepaireFileUtility.cs +++ b/src/Tools/RefRepairer/RepaireFileUtility.cs @@ -39,43 +39,40 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors { if (container.IsEmpty) { return; } + UnityObjectDataBase unityObjectData = null; + FileScope fileScope = default; for (int i = 0; i < container.collectedMissingTypesBufferCount; i++) { ref var missing = ref container.collectedMissingTypesBuffer[i]; - if (missing.IsNull) { continue; } - - var unityObjectData = missing.UnityObject; - using (var file = new FileScope(unityObjectData.GetLocalAssetPath())) + if (unityObjectData != missing.UnityObject) { - // missingsResolvingDatas , - do + unityObjectData = missing.UnityObject; + fileScope.Dispose(); + fileScope = new FileScope(unityObjectData.GetLocalAssetPath()); + } + + int lineIndex = NextRefLine(fileScope.lines, 0); + while (lineIndex > 0) + { + var line = fileScope.lines[lineIndex]; + + // Replace + // A string that is equivalent to this instance except that all instances of oldChar are replaced with newChar. + // If oldChar is not found in the current instance, the method returns the current instance unchanged. + // "returns the current instance unchanged", ReferenceEquals + line = line.Replace(missing.ResolvingData.OldSerializedInfoLine, missing.ResolvingData.NewSerializedInfoLine); + bool isChanged = !ReferenceEquals(fileScope.lines[lineIndex], line); + + if (isChanged) { - int lineIndex = NextRefLine(file.lines, 0); - while (lineIndex > 0) - { - var line = file.lines[lineIndex]; - - // Replace - // A string that is equivalent to this instance except that all instances of oldChar are replaced with newChar. - // If oldChar is not found in the current instance, the method returns the current instance unchanged. - // "returns the current instance unchanged", ReferenceEquals - line = line.Replace(missing.ResolvingData.OldSerializedInfoLine, missing.ResolvingData.NewSerializedInfoLine); - bool isChanged = !ReferenceEquals(file.lines[lineIndex], line); - - - if (isChanged) - { - file.lines[lineIndex] = line; - break; - } - lineIndex = NextRefLine(file.lines, lineIndex); - } - - missing = ref container.collectedMissingTypesBuffer[i++]; - } while (unityObjectData == missing.UnityObject); - i--;// + fileScope.lines[lineIndex] = line; + break; + } + lineIndex = NextRefLine(fileScope.lines, lineIndex); } } + fileScope.Dispose(); + container.RemoveResolved(); } public struct FileScope : IDisposable @@ -92,6 +89,7 @@ namespace DCFApixels.DragonECS.Unity.RefRepairer.Editors public void Dispose() { + if (string.IsNullOrEmpty(FilePath)) { return; } File.WriteAllLines(FilePath, lines); AssetDatabase.ImportAsset(LocalAssetPath, ImportAssetOptions.ForceUpdate); AssetDatabase.Refresh();