protected internal override void InternalSystemAwake() { List <EudiMap.TupleItem> tempItems = new List <EudiMap.TupleItem>(); List <FieldInfo> tempCorrectFields = new List <FieldInfo>(); var type = GetType(); var fields = type.GetFields(); var fieldsCount = fields.Length; for (int i = 0; i < fieldsCount; i++) { var field = fields[i]; var hasTupleAttribute = Attribute.IsDefined(field, typeof(InjectTuplesAttribute)); if (hasTupleAttribute) { var item = new EudiMap.TupleItem(); item.Attribute = (InjectTuplesAttribute)Attribute.GetCustomAttribute(field, typeof(InjectTuplesAttribute)); item.Type = field.FieldType; tempItems.Add(item); tempCorrectFields.Add(field); } } _linkedMap = Eudi.EntitiesManager.MapManager.GetMap(tempItems.ToArray()); MatchEntities = Eudi.EntitiesManager.MapManager.GetEntities(_linkedMap); // Set fields value from the map foreach (var field in tempCorrectFields) { var isGeneric = field.FieldType.IsGenericType; var wantedType = field.FieldType; var obj = _linkedMap.GetAssignedObject(wantedType); if (obj == null) { Debug.LogError(new Exception($"Field {field.Name} (c:{field.DeclaringType?.Name}) was set to null!")); } field.SetValue(this, obj); } if (_linkedMap == null || tempItems.Count == 0) { Debug.LogWarning($"!!! System {GetType().FullName} got no `InjectTuple` attribute."); tempItems?.Clear(); tempItems = null; //< remove reference } }
public static bool IsValid(Type originalType, EudiMap.TupleItem item) { if (item.Type.IsGenericType) { if (item.Type.GetGenericTypeDefinition() == typeof(EudiMatchArray <>)) { var newType = originalType; if (typeof(WrapperModuleEntity).IsAssignableFrom(newType)) { Type baseType = newType.BaseType; while (baseType != null) { if (baseType.IsGenericType && baseType.GetGenericTypeDefinition() == typeof(WrapperModuleEntity <>)) { newType = baseType.GetGenericArguments()[0]; break; } baseType = baseType.BaseType; if (baseType == typeof(System.Object)) { return(false); } } } var dataArrayType = typeof(EudiMatchArray <>).MakeGenericType(newType); return(dataArrayType == item.Type); } } else { if (item.Type == typeof(TransformAccessArray) && originalType == typeof(Transform)) { return(true); } } return(false); }