public bool HasField(Type type) { TypeAndArray typeAndArray = new TypeAndArray(type, type.IsArray); if (fields.ContainsKey(typeAndArray)) { return(true); } int foundIndex = -1; for (int i = 0; i < fieldPrefabs.Length; i++) { #if !ALE_STRIP_SAFETY || UNITY_EDITOR if (fieldPrefabs[i] == null) { throw new UnassignedReferenceException($"Field {i} has not been assigned on the level editor inspector."); } #endif if (fieldPrefabs[i].SupportsTypeDirect(type)) { foundIndex = i; break; } if (fieldPrefabs[i].SupportsType(type, type.IsArray)) { foundIndex = i; } } if (foundIndex >= 0) { fields.Add(typeAndArray, foundIndex); if (!pooledFields.ContainsKey(foundIndex)) { pooledFields.Add(foundIndex, new Stack <LevelEditorInspectorField>()); } return(true); } Debug.LogWarning("No field that supports " + type.FullName); return(false); }
public LevelEditorInspectorField GetField(Type fieldType, Transform parent) { LevelEditorInspectorField result = null; TypeAndArray type = new TypeAndArray(fieldType, fieldType.IsArray); if (fields.TryGetValue(type, out int fieldIndex)) { if (pooledFields[fieldIndex].Count > 0) { result = pooledFields[fieldIndex].Pop(); result.transform.SetParent(parent); } else { result = Instantiate(fieldPrefabs[fieldIndex], parent); result.UI = LevelEditor.UI; result.Index = fieldIndex; } } else { int selectedIndex = -1; for (int i = 0; i < fieldPrefabs.Length; i++) { if (fieldPrefabs[i].SupportsTypeDirect(fieldType)) { selectedIndex = i; break; } if (fieldPrefabs[i].SupportsType(fieldType, fieldType.IsArray)) { selectedIndex = i; } } if (selectedIndex >= 0) { fields.Add(type, selectedIndex); if (!pooledFields.ContainsKey(selectedIndex)) { pooledFields.Add(selectedIndex, new Stack <LevelEditorInspectorField>()); } result = Instantiate(fieldPrefabs[selectedIndex], parent); result.Index = selectedIndex; } } if (result == null) { Debug.LogWarning("No field that supports " + fieldType.FullName); return(null); } activeFields.Add(result); result.gameObject.SetActive(true); result.transform.SetAsLastSibling(); return(result); }