using System.Collections.Generic; using System.Linq; using UnityEngine; namespace AibisDream { [CreateAssetMenu(fileName = "BlockPuzzleValidator", menuName = "Block Puzzle/BlockPuzzleValidator")] public class BlockPuzzleValidator : ScriptableObject { [Tooltip("基础条件, 不满足无法提交")] public ValidateItem[] baseConditions; [Tooltip("额外条件, 不满足也可以提交")] public ValidateItem[] extraConditions; /// /// 验证是否可以完成拼图 /// /// /// public ValidateResult Validate(List shapeInGrid) { var result = new ValidateResult(); string[] shapeNames = shapeInGrid.Select(s => s.ShapeName).ToArray(); // 先校验基础条件 foreach (var condition in baseConditions) { var itemResult = condition.Validate(shapeNames); result.baseConditionResults.Add((condition.name, itemResult)); result.isPass = result.isPass && itemResult; } // 再校验额外条件 foreach (var condition in extraConditions) { var itemResult = condition.Validate(shapeNames); result.extraConditionResults.Add((condition.name, itemResult)); result.isExtraConditionPass = result.isExtraConditionPass && itemResult; } return result; } [System.Serializable] public struct ValidateItem { [Tooltip("名称, 仅用于显示")] public string name; [Tooltip("规则要求的组件,多种组件则合并后判断")] public string[] targetNames; public CompareSign compareSign; public int count; public bool Validate(string[] shapeNames) { var targetNames = this.targetNames; if (targetNames.Length == 0) return true; var totalCount = shapeNames.Where(name => targetNames.Contains(name)).Count(); return compareSign switch { CompareSign.Equal => totalCount == count, CompareSign.NotEqual => totalCount != count, CompareSign.GreaterThan => totalCount > count, CompareSign.LessThan => totalCount < count, CompareSign.GreaterThanOrEqual => totalCount >= count, CompareSign.LessThanOrEqual => totalCount <= count, _ => false, }; } } // 比较符 public enum CompareSign { Equal, NotEqual, GreaterThan, LessThan, GreaterThanOrEqual, LessThanOrEqual, } } public class ValidateResult { public bool isPass; public bool isExtraConditionPass; public List<(string name, bool isPass)> baseConditionResults; public List<(string name, bool isPass)> extraConditionResults; public ValidateResult() { isPass = true; isExtraConditionPass = true; baseConditionResults = new List<(string name, bool isPass)>(); extraConditionResults = new List<(string name, bool isPass)>(); } } }