diff --git a/Editor/Objects/Report.cs b/Editor/Objects/Report.cs index 5b68f9f..278955a 100644 --- a/Editor/Objects/Report.cs +++ b/Editor/Objects/Report.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; -using UnityEditor; using UnityEngine; + namespace Module.ProjectValidator.Editor { internal sealed class Report @@ -64,7 +64,7 @@ namespace Module.ProjectValidator.Editor public bool TryGetSeverityFor(string guid, out MappingEntry mapping) { - if (GUID.TryParse(guid, out var assetGuid) && _assetToSeverityMapping.TryGetValue(assetGuid, out mapping)) + if (UnityEngine.GUID.TryParse(guid, out var assetGuid) && _assetToSeverityMapping.TryGetValue(assetGuid, out mapping)) return true; mapping = new MappingEntry(); diff --git a/Editor/Settings/ProjectValidatorSettings.cs b/Editor/Settings/ProjectValidatorSettings.cs index ec2893f..7efb992 100644 --- a/Editor/Settings/ProjectValidatorSettings.cs +++ b/Editor/Settings/ProjectValidatorSettings.cs @@ -13,7 +13,6 @@ namespace Module.ProjectValidator.Editor internal sealed class ProjectValidatorSettings : ScriptableObject { public List assemblies = new(); - [NonReorderable] public List validators = new(); public const string MenuPath = "Project/Project Validator"; @@ -75,17 +74,13 @@ namespace Module.ProjectValidator.Editor for (var i = 0; i < settings.validators.Count; i++) { - temp.Add(settings.validators[i].assemblyQualifiedName); + temp.Add(settings.validators[i].type); } for (var i = 0; i < list.Count; i++) { - if (temp.Contains(list[i])) - continue; - - var type = Type.GetType(list[i]); - var name = type != null ? type.Name : "Unknown Type"; - settings.validators.Add(new ValidatorEnabled(name, list[i], true)); + if (!temp.Contains(list[i])) + settings.validators.Add(new ValidatorEnabled(list[i], true)); } for (var i = temp.Count - 1; i >= 0; i--) @@ -102,21 +97,19 @@ namespace Module.ProjectValidator.Editor for (var i = 0; i < types.Count; i++) { if (!types[i].IsInterface && !types[i].IsAbstract) - typeNames.Add(types[i].AssemblyQualifiedName); + typeNames.Add(types[i].FullName); } } [Serializable] public sealed class ValidatorEnabled { - public string name; - public string assemblyQualifiedName; + public string type; public bool enabled; - public ValidatorEnabled(string name, string assemblyQualifiedName, bool enabled) + public ValidatorEnabled(string type, bool enabled) { - this.name = name; - this.assemblyQualifiedName = assemblyQualifiedName; + this.type = type; this.enabled = enabled; } } diff --git a/Editor/ValidatorRunner.cs b/Editor/ValidatorRunner.cs index b69797a..54716f5 100644 --- a/Editor/ValidatorRunner.cs +++ b/Editor/ValidatorRunner.cs @@ -101,7 +101,7 @@ namespace Module.ProjectValidator.Editor if (!settings.validators[i].enabled) continue; - var type = Type.GetType(settings.validators[i].assemblyQualifiedName); + var type = Type.GetType(settings.validators[i].type); if (type != null) enabled.Add(type); @@ -179,12 +179,12 @@ namespace Module.ProjectValidator.Editor for (var i = 0; i < assets.Length; i++) { - var assetPath = AssetDatabase.GetAssetPath(assets[i]); - var scene = SceneManager.GetSceneByPath(assetPath); - var isLoaded = scene.isLoaded; - try { + var assetPath = AssetDatabase.GetAssetPath(assets[i]); + var scene = SceneManager.GetSceneByPath(assetPath); + var isLoaded = scene.isLoaded; + if (!isLoaded) scene = EditorSceneManager.OpenScene(assetPath, OpenSceneMode.Additive); @@ -194,16 +194,14 @@ namespace Module.ProjectValidator.Editor { ValidateGameObject(rootObjects[j], string.Empty, report, true); } + + if (!isLoaded) + EditorSceneManager.CloseScene(scene, true); } catch (Exception e) { Debug.LogException(e); } - finally - { - if (!isLoaded && scene.isLoaded) - EditorSceneManager.CloseScene(scene, true); - } } } @@ -423,18 +421,8 @@ namespace Module.ProjectValidator.Editor var fieldPath = parentFieldPath; ProjectValidatorUtility.AppendToFieldPath(e.FieldInfo, ref fieldPath); - - if (value is Array arr) - { - for (var j = 0; j < arr.Length; j++) - { - var eObj = arr.GetValue(j); - var fieldPathArrElement = fieldPath; - ProjectValidatorUtility.AppendToFieldPath(j, ref fieldPathArrElement); - Validate(assetGuid, relativePath, fieldPathArrElement, eObj, e.Entry, report); - } - } - else if (value is IEnumerable ie) + + if (value is IEnumerable ie) { var idx = 0; diff --git a/Editor/Validators/Assets/AssetValidatorMaterialShader.cs b/Editor/Validators/Assets/AssetValidatorMaterialShader.cs index f6e072f..6a0dfce 100644 --- a/Editor/Validators/Assets/AssetValidatorMaterialShader.cs +++ b/Editor/Validators/Assets/AssetValidatorMaterialShader.cs @@ -28,20 +28,16 @@ namespace Module.ProjectValidator.Editor var tagSearch = new ShaderTagId("RenderPipeline"); var tagPipeline = new ShaderTagId(pipeline.renderPipelineShaderTag); - var hasKeyword = false; for (var i = 0; i < shader.passCount; i++) { var tagPass = shader.FindPassTagValue(i, tagSearch); - if (tagPass != ShaderTagId.none) - hasKeyword = true; - if (tagPass == tagPipeline) return true; } - return !hasKeyword; + return false; } } } \ No newline at end of file diff --git a/Editor/Validators/Assets/AssetValidatorMaterialTexture.cs b/Editor/Validators/Assets/AssetValidatorMaterialTexture.cs index 37097fa..9f07b96 100644 --- a/Editor/Validators/Assets/AssetValidatorMaterialTexture.cs +++ b/Editor/Validators/Assets/AssetValidatorMaterialTexture.cs @@ -16,13 +16,10 @@ namespace Module.ProjectValidator.Editor for (var i = 0; i < count; i++) { var propertyType = obj.shader.GetPropertyType(i); - var propertyFlags = obj.shader.GetPropertyFlags(i); if (propertyType != ShaderPropertyType.Texture) continue; - if ((propertyFlags & (ShaderPropertyFlags.PerRendererData | ShaderPropertyFlags.HideInInspector | ShaderPropertyFlags.NonModifiableTextureData)) != 0) - continue; - + var propertyName = obj.shader.GetPropertyName(i); var propertyValue = obj.GetTexture(propertyName); diff --git a/Editor/Validators/GameObject/GameObjectValidatorDuplicateComponents.cs b/Editor/Validators/GameObject/GameObjectValidatorDuplicateComponents.cs index eaf89a1..1ea0509 100644 --- a/Editor/Validators/GameObject/GameObjectValidatorDuplicateComponents.cs +++ b/Editor/Validators/GameObject/GameObjectValidatorDuplicateComponents.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Reflection; +using System.Collections.Generic; using UnityEngine; using UnityEngine.Pool; @@ -30,7 +28,7 @@ namespace Module.ProjectValidator.Editor } else { - if (count > 1 && IsMultipleComponentsAllowed(type)) + if (count > 1) results.Add(ValidatorResult.Create(EValidatorSeverity.Warning, $"GameObject has duplicate '{type.Name}' ({count}) components")); type = t; @@ -38,13 +36,8 @@ namespace Module.ProjectValidator.Editor } } - if (count > 1 && IsMultipleComponentsAllowed(type)) + if (count > 1) results.Add(ValidatorResult.Create(EValidatorSeverity.Warning, $"GameObject has duplicate '{type.Name}' ({count}) components")); } - - private static bool IsMultipleComponentsAllowed(Type type) - { - return type.GetCustomAttribute(true) == null; - } } } \ No newline at end of file diff --git a/Editor/Window/EditorProjectValidatorWindow.cs b/Editor/Window/EditorProjectValidatorWindow.cs index 1d01017..7966bc8 100644 --- a/Editor/Window/EditorProjectValidatorWindow.cs +++ b/Editor/Window/EditorProjectValidatorWindow.cs @@ -8,18 +8,12 @@ namespace Module.ProjectValidator.Editor { internal sealed class EditorProjectValidatorWindow : EditorWindow { - private VisualElement _groupWarnings; - private Label _labelWarnings; - - private VisualElement _groupErrors; - private Label _labelErrors; - private MultiColumnTreeView _treeView; private string _searchFilter; - + private readonly List> _list = new(); private readonly List> _filteredList = new(); - + public void CreateGUI() { var root = rootVisualElement; @@ -27,15 +21,6 @@ namespace Module.ProjectValidator.Editor root.styleSheets.Add(EditorAssetUtility.LoadFirstAsset("StyleSheetEditorProjectValidatorWindow")); root.Add(asset.Instantiate()); - _groupWarnings = root.Q("status-warnings"); - _labelWarnings = _groupWarnings.Q