protected void ProcessRawField(DatablockDetectionInfo datablockDetectionInfo, string fieldName, Datablock datablock,
                                       string fieldValue)
        {
            if (fieldName.Equals("parent", StringComparison.OrdinalIgnoreCase))
            {
                datablock.Parent = DatablockManager.Instance.GetDatablock(fieldValue, datablockDetectionInfo.datablockType);
                return;
            }

            FieldInfo field =
                datablockDetectionInfo.fields.FirstOrDefault(f => f.Name.Equals(fieldName, StringComparison.OrdinalIgnoreCase));

            if (field == null)
            {
                return;
            }

            if (string.IsNullOrEmpty(fieldValue))
            {
                datablock.SetOverridesParent(field, false);
                return;
            }

            SetField(datablock, field, fieldValue);
        }
示例#2
0
    protected void ProcessRawField(DatablockDetectionInfo datablockDetectionInfo, string fieldName, Datablock datablock,
        string fieldValue)
    {
        if (fieldName.Equals("parent", StringComparison.OrdinalIgnoreCase))
        {
            datablock.Parent = DatablockManager.Instance.GetDatablock(fieldValue, datablockDetectionInfo.datablockType);
            return;
        }

        FieldInfo field =
            datablockDetectionInfo.fields.FirstOrDefault(f => f.Name.Equals(fieldName, StringComparison.OrdinalIgnoreCase));

        if (field == null)
            return;

        if (string.IsNullOrEmpty(fieldValue))
        {
            datablock.SetOverridesParent(field, false);
            return;
        }

        SetField(datablock, field, fieldValue);
    }
示例#3
0
    protected void SetField(Datablock datablock, FieldInfo field, string rawValue)
    {
        object newVal = null;

        if (field.FieldType == typeof (int))
        {
            int intVal;
            int.TryParse(rawValue, out intVal);
            newVal = intVal;
        }
        else if (field.FieldType == typeof(float))
        {
            float floatVal;
            float.TryParse(rawValue, out floatVal);
            newVal = floatVal;
        }
        else if (field.FieldType == typeof(bool))
        {
            if (rawValue.Equals("True", StringComparison.InvariantCultureIgnoreCase) ||
                rawValue.Equals("T", StringComparison.InvariantCultureIgnoreCase) ||
                rawValue.Equals("Yes", StringComparison.InvariantCultureIgnoreCase))
            {
                newVal = true;
            }
            else
            {
                newVal = false;
            }
        }
        else if (field.FieldType == typeof (double))
        {
            double doubleVal;
            double.TryParse(rawValue, out doubleVal);
            newVal = doubleVal;
        }
        else if (field.FieldType == typeof (string))
        {
            if (rawValue.Equals("(null)", StringComparison.OrdinalIgnoreCase))
            {
                newVal = null;
            }
            else
            {
                newVal = rawValue;
            }
        }
        else if (field.FieldType == typeof (Color))
        {
            Color colorVal = Color.white;

            try
            {
                string[] splitColor = rawValue.Split(',');
                if (splitColor.Length == 3)
                    colorVal = new Color(float.Parse(splitColor[0].Trim()), float.Parse(splitColor[1].Trim()), float.Parse(splitColor[2].Trim()));
                else if (splitColor.Length == 4)
                    colorVal = new Color(float.Parse(splitColor[0].Trim()), float.Parse(splitColor[1].Trim()), float.Parse(splitColor[2].Trim()), float.Parse(splitColor[3].Trim()));
            }
            catch
            {
            }

            newVal = colorVal;
        }
        else if (field.FieldType == typeof (Vector2))
        {
            Vector2 vector = Vector2.zero;

            try
            {
                string[] splitVec = rawValue.Split(',');
                vector = new Vector2(float.Parse(splitVec[0].Trim()), float.Parse(splitVec[1].Trim()));
            }
            catch
            {
            }

            newVal = vector;
        }
        else if (field.FieldType == typeof (Vector3))
        {
            Vector3 vector = Vector3.zero;

            try
            {
                string[] splitVec = rawValue.Split(',');
                vector = new Vector3(float.Parse(splitVec[0].Trim()), float.Parse(splitVec[1].Trim()), float.Parse(splitVec[2].Trim()));
            }
            catch
            {
            }

            newVal = vector;
        }
        else if (field.FieldType == typeof (Vector4))
        {
            Vector4 vector = Vector4.zero;

            try
            {
                string[] splitVec = rawValue.Split(',');
                vector = new Vector4(float.Parse(splitVec[0].Trim()), float.Parse(splitVec[1].Trim()), float.Parse(splitVec[2].Trim()), float.Parse(splitVec[3].Trim()));
            }
            catch
            {
            }

            newVal = vector;
        }
        else if (field.FieldType.IsSubclassOf(typeof (Object)))
        {
            string[] matchingAssets = AssetDatabase.FindAssets(rawValue + " t:" + field.FieldType.Name);

            if (!matchingAssets.Any())
            {
                Debug.LogWarning("Unable to find object: " + rawValue + " for " + field.Name + " on datablock " + datablock.name);
                return;
            }

            Object obj = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(matchingAssets[0]), field.FieldType);
            newVal = obj;
        }
        else if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof (DatablockRef<>))
        {
            Object obj = Resources.Load(rawValue);
            if (!obj)
            {
                Debug.LogWarning("Unable to load resource: " + rawValue + " for " + field.Name + " on datablock " + datablock.name);
                return;
            }

            newVal = Activator.CreateInstance(field.FieldType, new object[] {obj});
        }
        else if (field.FieldType.IsEnum)
        {
            try
            {
                newVal = Enum.Parse(field.FieldType, rawValue);
            }
            catch (Exception)
            {
                Debug.LogError("Invalid enum vlue " + rawValue + " for " + field.Name + " on datablock " + datablock.name);
            }
        }

        field.SetValue(datablock, newVal);
        datablock.SetOverridesParent(field, true);
    }
        protected void SetField(Datablock datablock, FieldInfo field, string rawValue)
        {
            object newVal = null;

            if (field.FieldType == typeof(int))
            {
                int intVal;
                int.TryParse(rawValue, out intVal);
                newVal = intVal;
            }
            else if (field.FieldType == typeof(float))
            {
                float floatVal;
                float.TryParse(rawValue, out floatVal);
                newVal = floatVal;
            }
            else if (field.FieldType == typeof(bool))
            {
                if (rawValue.Equals("True", StringComparison.InvariantCultureIgnoreCase) ||
                    rawValue.Equals("T", StringComparison.InvariantCultureIgnoreCase) ||
                    rawValue.Equals("Yes", StringComparison.InvariantCultureIgnoreCase))
                {
                    newVal = true;
                }
                else
                {
                    newVal = false;
                }
            }
            else if (field.FieldType == typeof(double))
            {
                double doubleVal;
                double.TryParse(rawValue, out doubleVal);
                newVal = doubleVal;
            }
            else if (field.FieldType == typeof(string))
            {
                if (rawValue.Equals("(null)", StringComparison.OrdinalIgnoreCase))
                {
                    newVal = null;
                }
                else
                {
                    newVal = rawValue;
                }
            }
            else if (field.FieldType == typeof(Color))
            {
                Color colorVal = Color.white;

                try
                {
                    string[] splitColor = rawValue.Split(',');
                    if (splitColor.Length == 3)
                    {
                        colorVal = new Color(float.Parse(splitColor[0].Trim()), float.Parse(splitColor[1].Trim()), float.Parse(splitColor[2].Trim()));
                    }
                    else if (splitColor.Length == 4)
                    {
                        colorVal = new Color(float.Parse(splitColor[0].Trim()), float.Parse(splitColor[1].Trim()), float.Parse(splitColor[2].Trim()), float.Parse(splitColor[3].Trim()));
                    }
                }
                catch
                {
                }

                newVal = colorVal;
            }
            else if (field.FieldType == typeof(Vector2))
            {
                Vector2 vector = Vector2.zero;

                try
                {
                    string[] splitVec = rawValue.Split(',');
                    vector = new Vector2(float.Parse(splitVec[0].Trim()), float.Parse(splitVec[1].Trim()));
                }
                catch
                {
                }

                newVal = vector;
            }
            else if (field.FieldType == typeof(Vector3))
            {
                Vector3 vector = Vector3.zero;

                try
                {
                    string[] splitVec = rawValue.Split(',');
                    vector = new Vector3(float.Parse(splitVec[0].Trim()), float.Parse(splitVec[1].Trim()), float.Parse(splitVec[2].Trim()));
                }
                catch
                {
                }

                newVal = vector;
            }
            else if (field.FieldType == typeof(Vector4))
            {
                Vector4 vector = Vector4.zero;

                try
                {
                    string[] splitVec = rawValue.Split(',');
                    vector = new Vector4(float.Parse(splitVec[0].Trim()), float.Parse(splitVec[1].Trim()), float.Parse(splitVec[2].Trim()), float.Parse(splitVec[3].Trim()));
                }
                catch
                {
                }

                newVal = vector;
            }
            else if (field.FieldType.IsSubclassOf(typeof(Object)))
            {
                string[] matchingAssets = AssetDatabase.FindAssets(rawValue + " t:" + field.FieldType.Name);

                if (!matchingAssets.Any())
                {
                    Debug.LogWarning("Unable to find object: " + rawValue + " for " + field.Name + " on datablock " + datablock.name);
                    return;
                }

                Object obj = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(matchingAssets[0]), field.FieldType);
                newVal = obj;
            }
            else if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(DatablockRef <>))
            {
                Object obj = Resources.Load(rawValue);
                if (!obj)
                {
                    Debug.LogWarning("Unable to load resource: " + rawValue + " for " + field.Name + " on datablock " + datablock.name);
                    return;
                }

                newVal = Activator.CreateInstance(field.FieldType, new object[] { obj });
            }
            else if (field.FieldType.IsEnum)
            {
                try
                {
                    newVal = Enum.Parse(field.FieldType, rawValue);
                }
                catch (Exception)
                {
                    Debug.LogError("Invalid enum vlue " + rawValue + " for " + field.Name + " on datablock " + datablock.name);
                }
            }

            field.SetValue(datablock, newVal);
            datablock.SetOverridesParent(field, true);
        }
示例#5
0
        /// <summary>
        ///     Draw a field
        /// </summary>
        /// <param name="field">Field to draw</param>
        /// <param name="indent">Indent the display of the field</param>
        protected virtual void DrawField(FieldInfo field, int indent = 0)
        {
            bool overrideParentValue = datablock.DoesOverridesParent(field) || datablock.Parent == null;

            Type   fieldType = field.FieldType;
            object val       = null;

            bool isDatablockReference = false;

            if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(DatablockRef <>))
            {
                fieldType            = fieldType.GetGenericArguments()[0];
                val                  = datablock.GetFieldValue <IDatablockRef>(field).GetObject();
                isDatablockReference = true;
            }
            else
            {
                val = datablock.GetFieldValue(field);
            }

            // Set the indent
            EditorGUI.indentLevel = indent;

            // Field overrides parent, or doesn't have a parent
            if (fieldType == typeof(int))
            {
                EditorGUILayout.BeginHorizontal();

                //var val = (int) field.GetValue(datablock);
                int newVal = EditorGUILayout.IntField(FieldLabel(field), (int)val);

                if ((int)val != newVal)
                {
                    SetFieldValue(field, newVal);
                }
            }
            else if (fieldType == typeof(float))
            {
                EditorGUILayout.BeginHorizontal();

                float newVal = EditorGUILayout.FloatField(FieldLabel(field), (float)val);

                if ((float)val != newVal)
                {
                    SetFieldValue(field, newVal);
                }
            }
#if UNITY_5_0
            else if (fieldType == typeof(double))
            {
                EditorGUILayout.BeginHorizontal();

                double newVal = EditorGUILayout.DoubleField(FieldLabel(field), (double)val);

                if ((double)val != newVal)
                {
                    SetFieldValue(field, newVal);
                }
            }
#endif
            else if (fieldType == typeof(bool))
            {
                EditorGUILayout.BeginHorizontal();

                bool newVal = EditorGUILayout.Toggle(FieldLabel(field), (bool)val);

                if ((bool)val != newVal)
                {
                    SetFieldValue(field, newVal);
                }
            }
            else if (fieldType == typeof(Vector2))
            {
                EditorGUILayout.BeginHorizontal();

                Vector2 newVal = EditorGUILayout.Vector2Field(FieldLabel(field), (Vector2)val);

                if ((Vector2)val != newVal)
                {
                    SetFieldValue(field, newVal);
                }
            }
            else if (fieldType == typeof(Vector3))
            {
                EditorGUILayout.BeginHorizontal();

                Vector3 newVal = EditorGUILayout.Vector3Field(FieldLabel(field), (Vector3)val);

                if ((Vector3)val != newVal)
                {
                    SetFieldValue(field, newVal);
                }
            }
            else if (fieldType == typeof(Vector4))
            {
                EditorGUILayout.BeginHorizontal();

                Vector4 newVal = EditorGUILayout.Vector4Field(FormatName(field.Name), (Vector4)val);

                if ((Vector4)val != newVal)
                {
                    SetFieldValue(field, newVal);
                }
            }
            else if (fieldType == typeof(Color))
            {
                EditorGUILayout.BeginHorizontal();

                Color newVal = EditorGUILayout.ColorField(FieldLabel(field), (Color)val);

                if ((Color)val != newVal)
                {
                    SetFieldValue(field, newVal);
                }
            }
            else if (fieldType.IsSubclassOf(typeof(Object)))
            {
                EditorGUILayout.BeginHorizontal();

                Object newVal = EditorGUILayout.ObjectField(FieldLabel(field), (Object)val, fieldType, false);
                if ((Object)val != newVal)
                {
                    if (isDatablockReference)
                    {
                        object val2 = Activator.CreateInstance(field.FieldType, new object[] { newVal });
                        SetFieldValue(field, val2);
                    }
                    else
                    {
                        SetFieldValue(field, newVal);
                    }
                }
            }
            else if (fieldType == typeof(string))
            {
                EditorGUILayout.BeginHorizontal();

                string newVal = EditorGUILayout.TextField(FieldLabel(field), (string)val);

                if ((string)val != newVal)
                {
                    SetFieldValue(field, newVal);
                }
            }
            else if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(List <>))
            {
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.BeginVertical();

                serializedObject.Update();
                SerializedProperty listProperty = serializedObject.FindProperty(field.Name);

                try
                {
                    ReorderableListGUI.Title(field.Name);
                    ReorderableListGUI.ListField(listProperty);
                }
                catch (ExitGUIException)
                {
                    // suppress unity bug
                }

                serializedObject.ApplyModifiedProperties();
                EditorGUILayout.EndVertical();
            }
            else if (fieldType.IsEnum)
            {
                EditorGUILayout.BeginHorizontal();

                Enum newVal;

                if (Attribute.IsDefined(fieldType, typeof(FlagsAttribute)))
                {
                    newVal = EditorGUILayout.EnumMaskField(FieldLabel(field), (Enum)val);
                }
                else
                {
                    newVal = EditorGUILayout.EnumPopup(FieldLabel(field), (Enum)val);
                }

                if (!Equals((Enum)val, newVal))
                {
                    SetFieldValue(field, newVal);
                }
            }
            else
            {
                return;
            }

            EditorGUI.indentLevel = 0;
            EditorGUI.BeginDisabledGroup(datablock.Parent == null);
            {
                bool useParentValPrev = overrideParentValue;
                overrideParentValue = EditorGUILayout.Toggle("", overrideParentValue, GUILayout.MaxWidth(20));
                if (overrideParentValue != useParentValPrev)
                {
                    datablock.SetOverridesParent(field, overrideParentValue);

                    if (overrideParentValue)
                    {
                        field.SetValue(datablock, GetDefaultValue(fieldType));
                    }
                }
            }
            EditorGUI.EndDisabledGroup();
            EditorGUILayout.EndHorizontal();

            if (fieldType.IsGenericType && fieldType.GetGenericTypeDefinition() == typeof(List <>))
            {
                EditorGUILayout.Space();
                EditorGUILayout.Space();
            }
        }