Files
2026-07-09 21:33:33 +02:00

52 lines
1.9 KiB
C#

using Sirenix.OdinInspector.Editor.Validation;
using Sirenix.Utilities;
using UnityEngine;
using VOID.Editor.AttributeValidator;
using VOID.Generic.World;
[assembly: RegisterValidator(typeof(AreaValidator))]
namespace VOID.Editor.AttributeValidator
{
public class AreaValidator : ValueValidator<Area>
{
protected override void Validate(ValidationResult result)
{
if (Value == null) return;
// Validate only ASSET - skip scene
if (!Value.gameObject.scene.path.IsNullOrWhitespace()) return;
ValidateIsInComplexAreaPrefab(result);
ValidatePosition(result);
}
private void ValidateIsInComplexAreaPrefab(ValidationResult result)
{
if (Value.transform.root.gameObject.GetComponent<ComplexArea>() == null)
{
result.AddError(
$"{nameof(Area)} needs to be placed inside prefab with component {nameof(ComplexArea)}!"
);
}
}
private void ValidatePosition(ValidationResult result)
{
var complexArea = Value.transform.root.gameObject.GetComponent<ComplexArea>();
if (!complexArea) return;
var relativePosition = complexArea.transform.position - Value.transform.position;
var xValid = relativePosition.x % Area.Size < Vector3.kEpsilon;
var yValid = relativePosition.y % Area.Size < Vector3.kEpsilon;
var zValid = relativePosition.z % Area.Size < Vector3.kEpsilon;
if (!xValid || !yValid || !zValid)
{
result.AddError(
$"'{Value.name}' is placed in invalid position."
+ $"\nRelative position to ComplexArea is {relativePosition} and is not dividable by {Area.Size}!"
);
}
}
}
}