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); }
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); }
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); }
/// <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(); } }