- Validator: Added asset validators with material texture and shader validation

- Validator: Added option to enable/disable certain validators
- Project Settings: Fixed issue, where changes weren't always saved
- Unity: Removed deprecated warnings in Unity 6.4
This commit is contained in:
Anders Ejlersen 2026-05-24 18:06:56 +02:00
parent 01ac17a078
commit dd55a87740
30 changed files with 716 additions and 38 deletions

View file

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace Module.ProjectValidator.Editor
{
@ -11,7 +12,12 @@ namespace Module.ProjectValidator.Editor
public readonly List<Entry> Entries = new();
private readonly Dictionary<GUID, MappingEntry> _assetToSeverityMapping = new();
#if UNITY_6000_4_OR_NEWER
private readonly Dictionary<EntityId, MappingEntry> _instanceToSeverityMapping = new();
#else
private readonly Dictionary<int, MappingEntry> _instanceToSeverityMapping = new();
#endif
public void Add(GUID assetGuid, string relativePath, string fieldPath, Attribute attribute, EValidatorSeverity severity, string message)
{
@ -58,13 +64,23 @@ 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();
return false;
}
#if UNITY_6000_4_OR_NEWER
public bool TryGetSeverityFor(EntityId entityId, out MappingEntry mapping)
{
if (_instanceToSeverityMapping.TryGetValue(entityId, out mapping))
return true;
mapping = new MappingEntry();
return false;
}
#else
public bool TryGetSeverityFor(int instanceId, out MappingEntry mapping)
{
if (_instanceToSeverityMapping.TryGetValue(instanceId, out mapping))
@ -73,6 +89,7 @@ namespace Module.ProjectValidator.Editor
mapping = new MappingEntry();
return false;
}
#endif
public bool TryGetSeverityFor(GUID assetGuid, string relativePath, out MappingEntry mapping)
{

View file

@ -31,9 +31,16 @@ namespace Module.ProjectValidator.Editor
if (!IsFieldSerializable(fi))
continue;
var attributes = fi.GetCustomAttributes();
var fieldAttributes = fi.GetCustomAttributes();
var fieldTypeAttributes = fi.FieldType.GetCustomAttributes();
foreach (var attribute in attributes)
foreach (var attribute in fieldAttributes)
{
if (validatorList.TryGetAttributeValidator(attribute.GetType(), out var validator))
entry.AddField(fi, attribute, validator);
}
foreach (var attribute in fieldTypeAttributes)
{
if (validatorList.TryGetAttributeValidator(attribute.GetType(), out var validator))
entry.AddField(fi, attribute, validator);
@ -164,7 +171,7 @@ namespace Module.ProjectValidator.Editor
return Components == null && Fields == null && Entries == null;
}
}
public sealed class ValidatorField
{
public readonly FieldInfo FieldInfo;

View file

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using UnityEngine;
@ -11,6 +12,7 @@ namespace Module.ProjectValidator.Editor
private readonly Dictionary<Type, object> _attributeValidators = new();
private readonly Dictionary<Type, List<object>> _componentValidators = new();
public readonly List<IGameObjectValidator> GameObjectValidators = new();
public readonly Dictionary<Type, List<AssetValidator>> AssetValidators = new();
public void AddAttribute(Type type)
{
@ -75,6 +77,33 @@ namespace Module.ProjectValidator.Editor
Debug.LogException(e);
}
}
public void AddAsset(Type type)
{
if (type.IsInterface || type.IsAbstract)
return;
var typeValidator = type.GetInterfaces().FirstOrDefault(typeInterface => typeInterface.IsGenericType && typeInterface.GetGenericTypeDefinition() == typeof(IAssetValidator<>));
var componentType = typeValidator?.GetGenericArguments()[0];
if (componentType == null)
return;
try
{
var instance = FormatterServices.GetUninitializedObject(type);
var validator = new AssetValidator(instance);
if (AssetValidators.TryGetValue(componentType, out var list))
list.Add(validator);
else
AssetValidators.Add(componentType, new List<AssetValidator> { validator });
}
catch (Exception e)
{
Debug.LogException(e);
}
}
public bool TryGetAttributeValidator(Type type, out object validatorInstance)
{
@ -85,5 +114,17 @@ namespace Module.ProjectValidator.Editor
{
return _componentValidators.TryGetValue(type, out validatorInstances);
}
public sealed class AssetValidator
{
public readonly object Validator;
public readonly MethodInfo ValidatorMethod;
public AssetValidator(object validator)
{
Validator = validator;
ValidatorMethod = validator.GetType().GetMethod("Validate");
}
}
}
}