- 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

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ddbf30cd5a674751be0c125c1f4e917b
timeCreated: 1779623970

View file

@ -0,0 +1,43 @@
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
namespace Module.ProjectValidator.Editor
{
internal sealed class AssetValidatorMaterialShader : IAssetValidator<Material>
{
public void Validate(Material obj, List<ValidatorResult> results)
{
if (obj.shader == null)
results.Add(ValidatorResult.Create(EValidatorSeverity.Error, "Shader is Null"));
else if (!IsCompatible(obj.shader))
results.Add(ValidatorResult.Create(EValidatorSeverity.Warning, $"Shader '{obj.shader.name}' is not compatible with render pipeline"));
else if (!obj.shader.isSupported)
results.Add(ValidatorResult.Create(EValidatorSeverity.Warning, $"Shader '{obj.shader.name}' is not supported"));
else if (ShaderUtil.ShaderHasError(obj.shader))
results.Add(ValidatorResult.Create(EValidatorSeverity.Error, $"Shader '{obj.shader.name}' has compile errors"));
}
private static bool IsCompatible(Shader shader)
{
var pipeline = GraphicsSettings.currentRenderPipeline;
if (pipeline == null)
return true;
var tagSearch = new ShaderTagId("RenderPipeline");
var tagPipeline = new ShaderTagId(pipeline.renderPipelineShaderTag);
for (var i = 0; i < shader.passCount; i++)
{
var tagPass = shader.FindPassTagValue(i, tagSearch);
if (tagPass == tagPipeline)
return true;
}
return false;
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2218d247daff44bf84629756b63ea650
timeCreated: 1779623986

View file

@ -0,0 +1,31 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
namespace Module.ProjectValidator.Editor
{
internal sealed class AssetValidatorMaterialTexture : IAssetValidator<Material>
{
public void Validate(Material obj, List<ValidatorResult> results)
{
if (obj.shader == null)
return;
var count = obj.shader.GetPropertyCount();
for (var i = 0; i < count; i++)
{
var propertyType = obj.shader.GetPropertyType(i);
if (propertyType != ShaderPropertyType.Texture)
continue;
var propertyName = obj.shader.GetPropertyName(i);
var propertyValue = obj.GetTexture(propertyName);
if (propertyValue == null)
results.Add(ValidatorResult.Create(EValidatorSeverity.Warning, $"Texture property '{propertyName}' is Null"));
}
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: cfeb4b29a9cd4ea79c1e9325b8122e17
timeCreated: 1779627240

View file

@ -0,0 +1,12 @@
using System;
namespace Module.ProjectValidator.Editor
{
internal sealed class AttributeValidatorObsolete : IAttributeValidator<ObsoleteAttribute>
{
public ValidatorResult Validate(ObsoleteAttribute attribute, object value)
{
return ValidatorResult.Create(EValidatorSeverity.Error, "Obsolete");
}
}
}

View file

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 982ac4e898cc2ca438e98a2f0034a8d3

View file

@ -0,0 +1,28 @@
using System.Collections.Generic;
using UnityEngine;
namespace Module.ProjectValidator.Editor
{
internal sealed class GameObjectValidatorTransform : IGameObjectValidator
{
public void Validate(GameObject gameObject, List<ValidatorResult> results)
{
var transform = gameObject.transform;
var lp = transform.localPosition;
var lr = transform.localRotation;
var ls = transform.localScale;
if (IsInvalid(lp.x) || IsInvalid(lp.y) || IsInvalid(lp.z))
results.Add(ValidatorResult.Create(EValidatorSeverity.Error, $"Local position '{lp}' is invalid"));
if (IsInvalid(lr.x) || IsInvalid(lr.y) || IsInvalid(lr.z) || IsInvalid(lr.w))
results.Add(ValidatorResult.Create(EValidatorSeverity.Error, $"Local rotation '{lr}' is invalid"));
if (IsInvalid(ls.x) || IsInvalid(ls.y) || IsInvalid(ls.z))
results.Add(ValidatorResult.Create(EValidatorSeverity.Error, $"Local scale '{ls}' is invalid"));
}
private static bool IsInvalid(float value)
{
return float.IsNaN(value) || float.IsInfinity(value);
}
}
}

View file

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 727d5de59b004deb8c192337bcee132e
timeCreated: 1779628852