1
0
mirror of https://github.com/maxartz15/Validator.git synced 2025-07-04 14:36:05 +02:00

Compare commits

...

7 Commits

Author SHA1 Message Date
max
5b70e24c32 Changed naming and tabs 2022-07-21 02:03:11 +02:00
max
15808ce035 Changed MenuName of attribute validators 2022-05-07 02:02:33 +02:00
max
8399d043f5 Update RequiredAttributeValidator
Fix required attribute validator by adding flags when getting the fields.
2022-05-04 00:39:01 +02:00
max
b4dd8744df Fix attribute 2022-05-03 21:11:12 +02:00
max
b13cf47fbf Update README.md 2022-01-02 15:21:39 +01:00
max
9c01bed215 Update README.md 2022-01-01 20:33:46 +01:00
max
74fd067220 Required Attribute Validator 2021-12-29 23:46:52 +01:00
18 changed files with 581 additions and 425 deletions

View File

@ -1,4 +1,12 @@
# Change Log:
## 0.1.4
- Fix attribute validator..?
## 0.1.3
- Fix attribute validator..?
## 0.1.2
- ...
## 0.1.1
- First prototype of Attribute validator.
## 0.1.1
- Search input.
- GUI toolbar.

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -2,6 +2,7 @@ namespace Validator.Editor
{
public interface IValidator
{
public string MenuName { get; }
public Report Validate();
}
}

View File

@ -156,7 +156,7 @@ namespace Validator.Editor
validatorOptionsMenu.AddSeparator("");
foreach (ValidatorInfo validatorInfo in validators)
{
validatorOptionsMenu.AddItem(new GUIContent($"{validatorInfo.validator.GetType().Name}"), validatorInfo.isEnabled, OnValidatorInfoVisibilityChangedEvent, validatorInfo);
validatorOptionsMenu.AddItem(new GUIContent($"{validatorInfo.validator.MenuName}"), validatorInfo.isEnabled, OnValidatorInfoVisibilityChangedEvent, validatorInfo);
}
validatorOptionsMenu.ShowAsContext();
}

View File

@ -0,0 +1,79 @@
using System.Linq;
using System.Reflection;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace Validator.Editor
{
public class RequiredAttributeAssetValidator : IValidator
{
public string MenuName => nameof(RequiredAttributeAssetValidator);
private const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
public Report Validate()
{
Report report = new Report(nameof(RequiredAttributeAssetValidator));
List<Object> objects = ValidatableAssetValidator.FindAssetsByType<Object>();
for (int i = 0; i < objects.Count; i++)
{
EditorUtility.DisplayProgressBar("RequiredAttributeAssetValidator", "RequiredAttribute...", (float)i / objects.Count);
IEnumerable<(FieldInfo FieldInfo, RequiredAttribute Attribute)> fieldsWithRequiredAttribute = from fi in objects[i].GetType().GetFields(flags)
let attr = fi.GetCustomAttributes(typeof(RequiredAttribute), true)
where attr.Length == 1
select (FieldInfo: fi, Attribute: attr.First() as RequiredAttribute);
foreach ((FieldInfo FieldInfo, RequiredAttribute Attribute) field in fieldsWithRequiredAttribute)
{
object o = field.FieldInfo.GetValue(objects[i]);
if (o == null || o.Equals(null))
{
report.Log(objects[i], field.Attribute.WarningType, field.Attribute.Category, $"{field.FieldInfo.Name} is null", $"Assign {field.FieldInfo.FieldType}");
}
}
}
EditorUtility.ClearProgressBar();
return report;
}
}
public class RequiredAttributeSceneValidator : IValidator
{
public string MenuName => nameof(RequiredAttributeSceneValidator);
private const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
public Report Validate()
{
Report report = new Report(nameof(RequiredAttributeSceneValidator));
List<MonoBehaviour> objects = ValidatableSceneValidator.FindAllObjectsOfType<MonoBehaviour>();
for (int i = 0; i < objects.Count; i++)
{
EditorUtility.DisplayProgressBar("RequiredAttributeSceneValidator", "RequiredAttribute...", (float)i / objects.Count);
IEnumerable<(FieldInfo FieldInfo, RequiredAttribute Attribute)> fieldsWithRequiredAttribute = from fi in objects[i].GetType().GetFields(flags)
let attr = fi.GetCustomAttributes(typeof(RequiredAttribute), true)
where attr.Length == 1
select (FieldInfo: fi, Attribute: attr.First() as RequiredAttribute);
foreach ((FieldInfo FieldInfo, RequiredAttribute Attribute) field in fieldsWithRequiredAttribute)
{
object o = field.FieldInfo.GetValue(objects[i]);
if (o == null || o.Equals(null))
{
report.Log(objects[i], field.Attribute.WarningType, field.Attribute.Category, $"{field.FieldInfo.Name} is null", $"Assign {field.FieldInfo.FieldType}");
}
}
}
EditorUtility.ClearProgressBar();
return report;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 90d5c1b8964451644b0aa09257ab0bc3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,55 +0,0 @@
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Validator.Editor
{
public class SceneValidator : IValidator
{
public Report Validate()
{
Report report = new Report("SceneValidator");
List<IValidatable> objects = FindAllObjectsOfType<IValidatable>();
for (int i = 0; i < objects.Count; i++)
{
EditorUtility.DisplayProgressBar("SceneValidator", "Validate...", (float)i / objects.Count);
objects[i].Validate(report);
}
EditorUtility.ClearProgressBar();
return report;
}
private static List<GameObject> GetAllRootGameObjects()
{
List<GameObject> gameObjects = new List<GameObject>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
EditorUtility.DisplayProgressBar("SceneValidator", "GetAllRootGameObjects...", (float)i / SceneManager.sceneCount);
gameObjects.AddRange(SceneManager.GetSceneAt(i).GetRootGameObjects());
}
EditorUtility.ClearProgressBar();
return gameObjects;
}
private static List<T> FindAllObjectsOfType<T>()
{
List<T> objects = new List<T>();
List<GameObject> gameObjects = GetAllRootGameObjects();
for (int i = 0; i < gameObjects.Count; i++)
{
EditorUtility.DisplayProgressBar("SceneValidator", "FindAllObjectsOfType...", (float)i / gameObjects.Count);
objects.AddRange(gameObjects[i].GetComponentsInChildren<T>(true));
}
EditorUtility.ClearProgressBar();
return objects;
}
}
}

View File

@ -4,11 +4,13 @@ using UnityEngine;
namespace Validator.Editor
{
public class AssetValidator : IValidator
public class ValidatableAssetValidator : IValidator
{
public string MenuName => nameof(ValidatableAssetValidator);
public Report Validate()
{
Report report = new Report("AssetValidator");
Report report = new Report(nameof(ValidatableAssetValidator));
List<Object> objects = FindAssetsByType<Object>();
for (int i = 0; i < objects.Count; i++)

View File

@ -0,0 +1,57 @@
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace Validator.Editor
{
public class ValidatableSceneValidator : IValidator
{
public string MenuName => nameof(ValidatableSceneValidator);
public Report Validate()
{
Report report = new Report(nameof(ValidatableSceneValidator));
List<IValidatable> objects = FindAllObjectsOfType<IValidatable>();
for (int i = 0; i < objects.Count; i++)
{
EditorUtility.DisplayProgressBar("SceneValidator", "Validate...", (float)i / objects.Count);
objects[i].Validate(report);
}
EditorUtility.ClearProgressBar();
return report;
}
private static List<GameObject> GetAllRootGameObjects()
{
List<GameObject> gameObjects = new List<GameObject>();
for (int i = 0; i < SceneManager.sceneCount; i++)
{
EditorUtility.DisplayProgressBar("SceneValidator", "GetAllRootGameObjects...", (float)i / SceneManager.sceneCount);
gameObjects.AddRange(SceneManager.GetSceneAt(i).GetRootGameObjects());
}
EditorUtility.ClearProgressBar();
return gameObjects;
}
public static List<T> FindAllObjectsOfType<T>()
{
List<T> objects = new List<T>();
List<GameObject> gameObjects = GetAllRootGameObjects();
for (int i = 0; i < gameObjects.Count; i++)
{
EditorUtility.DisplayProgressBar("SceneValidator", "FindAllObjectsOfType...", (float)i / gameObjects.Count);
objects.AddRange(gameObjects[i].GetComponentsInChildren<T>(true));
}
EditorUtility.ClearProgressBar();
return objects;
}
}
}

View File

@ -1,12 +1,11 @@
# Validator
![ValidatorWindow](Documentation~/Images/ValidatorWindow_01.png)
Unity project validator framework.
## Getting Started
Open Validator Window:
> Window -> General -> Validator
Add validatable:
Add a custom validate check using the `IValidatable` interface:
```C#
using Validator;
@ -28,13 +27,21 @@ public class MyBehaviour : MonoBehaviour, IValidatable
}
```
Add a validate check using `[Required]` attribute:
```C#
[SerializeField, Required] private GameObject playerPrefab = null; // If someone forgets to assign it, it would be invalid.
```
Open Validator Window:
> Window -> General -> Validator
Run the validator:
> Click the 'run/play' button and wait for the report to be generated.
## Install
[Installing from a Git URL](https://docs.unity3d.com/Manual/upm-ui-giturl.html)
[Unitypackage](https://github.com/COMPANYNAME/PACKAGENAME/releases)
## LICENSE
Overall package is licensed under [MIT](/LICENSE.md), unless otherwise noted in the [3rd party licenses](/THIRD%20PARTY%20NOTICES.md) file and/or source code.

8
Runtime/Validators.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8cd25e23ad137e24ea0f469556831712
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 25705f09a21a10049aed213ea301db84
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,19 @@
using System;
namespace Validator
{
[AttributeUsage(AttributeTargets.Field, Inherited = true, AllowMultiple = false)]
public class RequiredAttribute : Attribute
{
public WarningType WarningType { get; private set; } = WarningType.Error;
public string Category { get; private set; } = ReportCategories.Design;
public RequiredAttribute() { }
public RequiredAttribute(WarningType warningType = WarningType.Error, string category = ReportCategories.Design)
{
WarningType = warningType;
Category = category;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4dbbb107f0e849140b1132ac5dcca90f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,7 +1,7 @@
{
"name": "com.vertexcolor.validator",
"displayName": "Validator",
"version": "0.1.1",
"version": "0.1.4",
"unity": "2019.3",
"description": "Unity project validator framework.",
"category": "Tool",