コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }