using System; using System.Collections.Generic; using System.Linq; using ClusterVR.CreatorKit.Editor.Repository; using ClusterVR.CreatorKit.Translation; using UnityEngine; namespace ClusterVR.CreatorKit.Editor.Validator.GltfItemExporter { sealed class RequireComponentValidator { readonly Dictionary> missingComponentList = new(); internal IEnumerable GetMessage() { var validationMessages = new List(); foreach (var missingInfo in missingComponentList) { validationMessages.Add(new ValidationMessage( TranslationUtility.GetMessage(TranslationTable.cck_missing_required_components, missingInfo.Key.name, string.Join(", ", missingInfo.Value)), ValidationMessage.MessageType.Error)); } return validationMessages; } internal void Validate(Component component) { var requireComponentAttributes = Attribute.GetCustomAttributes(component.GetType(), typeof(RequireComponent)) .Cast(); foreach (var requireComponent in requireComponentAttributes) { ValidateRequireComponent(component, requireComponent.m_Type0); ValidateRequireComponent(component, requireComponent.m_Type1); ValidateRequireComponent(component, requireComponent.m_Type2); } } void ValidateRequireComponent(Component component, Type requireType) { if (requireType == null) { return; } var gameObject = component.gameObject; if (gameObject.TryGetComponent(requireType, out _)) { return; } if (missingComponentList.TryGetValue(gameObject, out var componentList)) { componentList.Add(requireType); } else { missingComponentList.Add(gameObject, new HashSet { requireType }); } } } }