Added support to scan prefabs

This commit is contained in:
Anders Ejlersen 2026-05-19 20:15:30 +02:00
parent 269789b36f
commit 591693da1d
11 changed files with 159 additions and 62 deletions

View file

@ -30,6 +30,7 @@ namespace Module.ProjectValidator.Editor
var report = new Report();
ValidateAllScenes(report);
ValidateAllAssets(report);
ValidateAllPrefabs(report);
report.RebuildAssetMapping();
report.RebuildInstanceMapping();
report.SetAsActive();
@ -155,7 +156,7 @@ namespace Module.ProjectValidator.Editor
for (var j = 0; j < rootObjects.Count; j++)
{
ValidateGameObject(rootObjects[j], string.Empty, report);
ValidateGameObject(rootObjects[j], "scene:", report, true);
}
if (!isLoaded)
@ -173,6 +174,23 @@ namespace Module.ProjectValidator.Editor
ValidateAssetsBytype<ScriptableObject>(report);
}
private static void ValidateAllPrefabs(Report report)
{
var assets = EditorAssetUtility.LoadAllAssets<GameObject>();
for (var i = 0; i < assets.Length; i++)
{
try
{
ValidateGameObject(assets[i], "prefab:", report, true);
}
catch (Exception e)
{
Debug.LogException(e);
}
}
}
private static void ValidateAssetsBytype<T>(Report report) where T : UnityEngine.Object
{
var assets = EditorAssetUtility.LoadAllAssets<T>();
@ -193,12 +211,13 @@ namespace Module.ProjectValidator.Editor
private static void ValidateUnityObject(UnityEngine.Object obj, Report report)
{
var assetGuid = EditorAssetUtility.ObjectToAssetGuid(obj);
Validate(assetGuid, string.Empty, obj, report);
var assetPath = AssetDatabase.GUIDToAssetPath(assetGuid);
Validate(assetGuid, $"asset:{assetPath}", obj, report);
}
private static void ValidateGameObject(GameObject gameObject, string scenePath, Report report)
private static void ValidateGameObject(GameObject gameObject, string relativePath, Report report, bool initial)
{
ProjectValidatorUtility.AppendToScenePath(gameObject, ref scenePath);
ProjectValidatorUtility.AppendToRelativePath(gameObject, ref relativePath, initial);
var assetGuid = EditorAssetUtility.GetAssetGuid(gameObject);
using var _ = ListPool<ValidatorResult>.Get(out var results);
@ -215,15 +234,15 @@ namespace Module.ProjectValidator.Editor
var result = results[j];
if (result.Severity != EValidatorSeverity.Valid)
report.Add(assetGuid, scenePath, string.Empty, type, result.Severity, result.Message);
report.Add(assetGuid, relativePath, string.Empty, type, result.Severity, result.Message);
}
}
ValidateComponents(gameObject, assetGuid, scenePath, report);
ValidateChildren(gameObject, scenePath, report);
ValidateComponents(gameObject, assetGuid, relativePath, report);
ValidateChildren(gameObject, relativePath, report);
}
private static void ValidateComponents(GameObject gameObject, GUID assetGuid, string scenePath, Report report)
private static void ValidateComponents(GameObject gameObject, GUID assetGuid, string relativePath, Report report)
{
using var _ = ListPool<Component>.Get(out var components);
gameObject.GetComponents(components);
@ -231,21 +250,21 @@ namespace Module.ProjectValidator.Editor
for (var i = 0; i < components.Count; i++)
{
if (components[i] != null)
Validate(assetGuid, scenePath, components[i], report);
Validate(assetGuid, relativePath, components[i], report);
}
}
private static void ValidateChildren(GameObject gameObject, string scenePath, Report report)
private static void ValidateChildren(GameObject gameObject, string relativePath, Report report)
{
var transform = gameObject.transform;
for (var i = 0; i < transform.childCount; i++)
{
ValidateGameObject(transform.GetChild(i).gameObject, scenePath, report);
ValidateGameObject(transform.GetChild(i).gameObject, relativePath, report, false);
}
}
private static void Validate(GUID assetGuid, string scenePath, object obj, Report report)
private static void Validate(GUID assetGuid, string relativePath, object obj, Report report)
{
var type = obj.GetType();
@ -253,10 +272,10 @@ namespace Module.ProjectValidator.Editor
return;
var fieldPath = obj.GetType().Name;
Validate(assetGuid, scenePath, fieldPath, obj, entry, report);
Validate(assetGuid, relativePath, fieldPath, obj, entry, report);
}
private static void Validate(GUID assetGuid, string scenePath, string parentFieldPath, object obj, TypeTree.Entry entry, Report report)
private static void Validate(GUID assetGuid, string relativePath, string parentFieldPath, object obj, TypeTree.Entry entry, Report report)
{
if (obj == null)
return;
@ -268,7 +287,7 @@ namespace Module.ProjectValidator.Editor
try
{
var component = entry.Components[i];
ValidateComponent(component, obj, assetGuid, scenePath, report);
ValidateComponent(component, obj, assetGuid, relativePath, report);
}
catch (Exception e)
{
@ -297,13 +316,13 @@ namespace Module.ProjectValidator.Editor
{
var fieldPathArrElement = fieldPath;
ProjectValidatorUtility.AppendToFieldPath(idx, ref fieldPathArrElement);
ValidateField(field, eObj, assetGuid, scenePath, fieldPathArrElement, report);
ValidateField(field, eObj, assetGuid, relativePath, fieldPathArrElement, report);
idx++;
}
}
else
{
ValidateField(field, value, assetGuid, scenePath, fieldPath, report);
ValidateField(field, value, assetGuid, relativePath, fieldPath, report);
}
}
catch (Exception e)
@ -333,13 +352,13 @@ namespace Module.ProjectValidator.Editor
{
var fieldPathArrElement = fieldPath;
ProjectValidatorUtility.AppendToFieldPath(idx, ref fieldPathArrElement);
Validate(assetGuid, scenePath, fieldPathArrElement, eObj, e.Entry, report);
Validate(assetGuid, relativePath, fieldPathArrElement, eObj, e.Entry, report);
idx++;
}
}
else
{
Validate(assetGuid, scenePath, fieldPath, value, e.Entry, report);
Validate(assetGuid, relativePath, fieldPath, value, e.Entry, report);
}
}
catch (Exception e)
@ -350,15 +369,15 @@ namespace Module.ProjectValidator.Editor
}
}
private static void ValidateField(TypeTree.ValidatorField field, object value, GUID assetGuid, string scenePath, string fieldPath, Report report)
private static void ValidateField(TypeTree.ValidatorField field, object value, GUID assetGuid, string relativePath, string fieldPath, Report report)
{
var result = (ValidatorResult)field.ValidatorMethod.Invoke(field.Validator, new[] { field.Attribute, value });
if (result.Severity != EValidatorSeverity.Valid)
report.Add(assetGuid, scenePath, fieldPath, field.Attribute, result.Severity, result.Message);
report.Add(assetGuid, relativePath, fieldPath, field.Attribute, result.Severity, result.Message);
}
private static void ValidateComponent(TypeTree.ValidatorComponent component, object value, GUID assetGuid, string scenePath, Report report)
private static void ValidateComponent(TypeTree.ValidatorComponent component, object value, GUID assetGuid, string relativePath, Report report)
{
using var _ = ListPool<ValidatorResult>.Get(out var results);
component.ValidatorMethod.Invoke(component.Validator, new[] { value, results });
@ -369,7 +388,7 @@ namespace Module.ProjectValidator.Editor
var result = results[i];
if (result.Severity != EValidatorSeverity.Valid)
report.Add(assetGuid, scenePath, string.Empty, type, result.Severity, result.Message);
report.Add(assetGuid, relativePath, string.Empty, type, result.Severity, result.Message);
}
}
}