Exemple #1
0
        private Dictionary <int, string> GetGameModelListNamesForID(int id, bool useFilters)
        {
            IList list = GetListForTable(id);

            if (list != null)
            {
                Dictionary <int, string> names = new Dictionary <int, string>();

                for (int i = 0; i < list.Count; i++)
                {
                    IGameDataModel modelData = list[i] as IGameDataModel;
                    if (modelData != null)
                    {
                        if (useFilters)
                        {
                            if (DoesModelPassFilters(id, modelData))
                            {
                                names.Add(i, modelData.ListName);
                            }
                        }
                        else
                        {
                            names.Add(i, modelData.ListName);
                        }
                    }
                }

                return(names);
            }
            else
            {
                return(null);
            }
        }
        private void RenderIGameDataModelField(FieldInfo field, DataField attribute, int fieldCount)
        {
            if (fieldCount > 0)
            {
                EditorGUILayout.Space();
            }

            //EditorGUILayout.Foldout(true, "hello");

            EditorGUILayout.LabelField(attribute.EditorLabel, EditorStyles.boldLabel);

            IGameDataModel model = field.GetValue(this) as IGameDataModel;

            if (model == null)
            {
                model = System.Activator.CreateInstance(field.FieldType) as IGameDataModel;
            }

            if (model != null)
            {
                model.RenderForm(true);
            }

            //EditorGUILayout.EndToggleGroup();
        }
Exemple #3
0
        public IGameDataModel GetModelDataAt(int tableID, int modelDataIndex)
        {
            IList          list  = GetListForTable(tableID);
            IGameDataModel model = null;

            if (list != null && modelDataIndex >= 0 && modelDataIndex < list.Count)
            {
                model = list[modelDataIndex] as IGameDataModel;
            }
            else if (list == null)
            {
                model = GetSingleModelForTable(tableID);
            }
            else
            {
                model = null;
            }

            if (model != null)
            {
                model.SetDataReference(this);
            }

            return(model);
        }
Exemple #4
0
 private IGameDataModel GetSingleModelForTable(int tableID)
 {
     if (_tables.ContainsKey(tableID))
     {
         FieldInfo      field = _tables[tableID];
         IGameDataModel model = field.GetValue(this) as IGameDataModel;
         model.SetDataReference(this);
         return(model);
     }
     else
     {
         return(null);
     }
 }
Exemple #5
0
        public IGameDataModel CreateNewModel(int tableID)
        {
            if (_tables.ContainsKey(tableID))
            {
                DataTable table = GetTableAttributeForField(_tables[tableID]);
                if (table != null)
                {
                    IGameDataModel model = System.Activator.CreateInstance(table.Type, GetNextModelID(tableID)) as IGameDataModel;
                    model.SetDataReference(this);
                    return(model);
                }
            }

            return(null);
        }
Exemple #6
0
        /// <summary>
        /// Adds the model data.
        /// </summary>
        /// <returns>Returns <code>false</code> if model data with this ID already exists.</returns>
        /// <param name="tableID">Model identifier.</param>
        /// <param name="modelData">Model data.</param>
        public bool AddModelData(int tableID, IGameDataModel modelData)
        {
            if (IsModelIDAlreadyInUse(tableID, modelData.ID))
            {
                return(false);
            }

            IList list = GetListForTable(tableID);

            if (list != null)
            {
                list.Add(modelData);
                modelData.SetDataReference(this);
            }

            return(true);
        }
        public void SetDataReference(GameData dataReference)
        {
            _dataReference = dataReference;

            FieldInfo[] fields = GetFields(this);
            foreach (FieldInfo field in fields)
            {
                if (field.FieldType.GetInterface(typeof(IGameDataModel).Name) != null)
                {
                    IGameDataModel model = field.GetValue(this) as IGameDataModel;
                    if (model != null)
                    {
                        model.SetDataReference(dataReference);
                    }
                }
            }
        }
        private void RenderUI()
        {
            EditorGUILayout.Space();
            RenderDataBase();

            if (DataLoaded)
            {
                if (_data.CheckForOpenModelRequest())
                {
                    _previousModelID = _currentModelID;
                    _previousSelectedModelDataIndex = _selectedModelDataIndex;

                    _currentModelID         = _data.GetOpenModelRequestID();
                    _selectedModelDataIndex = _data.GetOpenModelRequestDataIndex();

                    IGameDataModel selectedModel = _data.GetModelDataAt(_currentModelID, _selectedModelDataIndex);
                    if (selectedModel != null)
                    {
                        GUI.FocusControl(null);
                        _model = _data.CreateNewModel(_currentModelID);
                        _model.CopyValuesFrom(selectedModel, true);
                        _state = State.Edit;
                    }

                    _modelsViewScrollPos = _modelsListViewScrollPos = _editViewScrollPos = Vector2.zero;
                    _data.ResetOpenModelRequest();
                }

                _globalScrollPos = EditorGUILayout.BeginScrollView(_globalScrollPos, "box", GUILayout.ExpandHeight(true));

                EditorGUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
                RenderModelsView();
                RenderModelsListView();
                RenderEditArea();
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.EndScrollView();
            }
            else
            {
                _currentModelID         = 0;
                _selectedModelDataIndex = -1;
                _state = State.Blank;
            }
        }
        private void RenderDataBase()
        {
            EditorGUILayout.BeginVertical();
            if (!DataLoaded)
            {
                EditorGUILayout.LabelField("No database found. Please drag a database instance reference from Project view here");
            }

            EditorGUILayout.BeginHorizontal();
            _data = EditorGUILayout.ObjectField("Database", _data, typeof(GameData), false) as GameData;

            if (DataLoaded)
            {
                if (GUILayout.Button("Generate JSON", GUILayout.Width(120)))
                {
                    string json = JsonUtility.ToJson(_data, true);
                    EditorGUIUtility.systemCopyBuffer = json;
                    Debug.Log("Also copied to your clipboard: \n" + json);
                }

                if (GUILayout.Button("Back", GUILayout.Width(120)) && _previousModelID > 0)
                {
                    _currentModelID         = _previousModelID;
                    _selectedModelDataIndex = _previousSelectedModelDataIndex;

                    IGameDataModel selectedModel = _data.GetModelDataAt(_currentModelID, _selectedModelDataIndex);
                    if (selectedModel != null)
                    {
                        GUI.FocusControl(null);
                        _model = _data.CreateNewModel(_currentModelID);
                        _model.CopyValuesFrom(selectedModel, true);
                        _state = State.Edit;
                    }

                    _modelsViewScrollPos = _modelsListViewScrollPos = _editViewScrollPos = Vector2.zero;
                    _previousModelID     = _previousSelectedModelDataIndex = -1;
                }
            }

            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();
        }
        private void RenderModelsListView()
        {
            if (_currentModelID > 0 && _data.IsModelDataAList(_currentModelID))
            {
                EditorGUILayout.BeginVertical(GUILayout.Width(250));
                EditorGUILayout.Space();
                EditorGUILayout.LabelField(_data.GetTableName(_currentModelID));

                _modelsListViewScrollPos = EditorGUILayout.BeginScrollView(_modelsListViewScrollPos, "box", GUILayout.ExpandHeight(true));
                int modelIndex = _data.RenderModelsDataListView(_currentModelID);
                EditorGUILayout.EndScrollView();

                if (modelIndex > -1)
                {
                    IGameDataModel selectedModel = _data.GetModelDataAt(_currentModelID, modelIndex);
                    if (selectedModel != null)
                    {
                        GUI.FocusControl(null);
                        _model = _data.CreateNewModel(_currentModelID);
                        _model.CopyValuesFrom(selectedModel, true);
                        _selectedModelDataIndex = modelIndex;
                        _editViewScrollPos      = Vector2.zero;
                        _state = State.Edit;
                    }
                }

                _data.RenderFilters(_currentModelID);

                if (GUILayout.Button("New"))
                {
                    GUI.FocusControl(null);
                    _model             = _data.CreateNewModel(_currentModelID);
                    _editViewScrollPos = Vector2.zero;
                    _state             = State.Add;
                }

                EditorGUILayout.Space();
                EditorGUILayout.EndVertical();
            }
        }
        private void RenderModelAdd()
        {
            if (_model != null)
            {
                //EditorGUILayout.LabelField("");
                //EditorGUILayout.Space();

                _model.RenderForm(false);
                //EditorGUILayout.Space();
                EditorGUILayout.EndScrollView();

                EditorGUILayout.BeginHorizontal();

                GUILayout.FlexibleSpace();

                if (GUILayout.Button("Add", GUILayout.Width(100)))
                {
                    GUI.FocusControl(null);

                    if (_data.AddModelData(_currentModelID, _model))
                    {
                        EditorUtility.SetDirty(_data);
                        _model = null;
                        _state = State.Blank;
                    }
                    else
                    {
                        EditorUtility.DisplayDialog("Error", "Model data with this ID already exists", "OK");
                    }
                }
                else if (GUILayout.Button("Cancel", GUILayout.Width(100)))
                {
                    GUI.FocusControl(null);
                    _model = null;
                    _state = State.Blank;
                }

                EditorGUILayout.EndHorizontal();
            }
        }
        public void CopyValuesFrom(IGameDataModel data, bool copyID)
        {
            FieldInfo[] fields = GetFields(data);

            foreach (FieldInfo field in fields)
            {
                if (field.Name.Equals("_id") && !copyID)
                {
                    continue;
                }

                object[] attrs = field.GetCustomAttributes(typeof(DataField), true);
                foreach (object attr in attrs)
                {
                    DataField fieldAttr = attr as DataField;
                    if (fieldAttr != null)
                    {
                        ReplaceValueForFieldInCurrentInstance(field, data);
                    }
                }
            }
        }
        private void RenderModelsView()
        {
            EditorGUILayout.BeginVertical(GUILayout.Width(250));
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Tables");

            _modelsViewScrollPos = EditorGUILayout.BeginScrollView(_modelsViewScrollPos, "box", GUILayout.ExpandHeight(true));
            int modelID = _data.RenderModelsView();

            if (modelID > 0 && modelID != _currentModelID)
            {
                _currentModelID = modelID;
                if (_data.IsModelDataAList(_currentModelID))
                {
                    GUI.FocusControl(null);
                    _state = State.Blank;
                }
                else
                {
                    IGameDataModel selectedModel = _data.GetModelDataAt(_currentModelID, 0);
                    if (selectedModel != null)
                    {
                        GUI.FocusControl(null);
                        _model = _data.CreateNewModel(_currentModelID);
                        _model.CopyValuesFrom(selectedModel, true);
                        _selectedModelDataIndex = 0;
                        _editViewScrollPos      = Vector2.zero;
                        _state = State.Edit;
                    }
                }
            }

            EditorGUILayout.EndScrollView();

            EditorGUILayout.Space();
            EditorGUILayout.EndVertical();
        }
        private void RenderModelEdit()
        {
            if (_model != null)
            {
                //EditorGUILayout.LabelField(_model.ListName);
                //EditorGUILayout.Space();

                _model.RenderForm(false);
                //EditorGUILayout.Space();
                EditorGUILayout.EndScrollView();

                EditorGUILayout.BeginHorizontal();

                GUILayout.FlexibleSpace();

                if (GUILayout.Button("Save", GUILayout.Width(100)))
                {
                    GUI.FocusControl(null);
                    IGameDataModel model = _data.GetModelDataAt(_currentModelID, _selectedModelDataIndex);

                    bool idAlreadyInUse = model.ID != _model.ID && _data.IsModelIDAlreadyInUse(_currentModelID, _model.ID);

                    if (!idAlreadyInUse)
                    {
                        if (model != null)
                        {
                            model.CopyValuesFrom(_model, true);
                            EditorUtility.SetDirty(_data);
                        }
                        _model = null;
                        _state = State.Blank;

                        if (!_data.IsModelDataAList(_currentModelID))
                        {
                            _currentModelID = 0;
                        }
                    }
                    else
                    {
                        EditorUtility.DisplayDialog("Error", "Model data with this ID already exists", "OK");
                    }
                }
                else if (GUILayout.Button("Cancel", GUILayout.Width(100)))
                {
                    GUI.FocusControl(null);
                    _model = null;
                    _state = State.Blank;
                }

                if (_data.IsModelDataAList(_currentModelID))
                {
                    if (GUILayout.Button("Duplicate", GUILayout.Width(100)))
                    {
                        if (EditorUtility.DisplayDialog("Warning!", "Are you sure you want to create duplicate of " + _model.ListName + "? All unsaved changes will be lost", "Yes", "No"))
                        {
                            GUI.FocusControl(null);
                            IGameDataModel copy = _data.CreateNewModel(_currentModelID);
                            copy.CopyValuesFrom(_model, false);
                            _model             = copy;
                            _editViewScrollPos = Vector2.zero;
                            _state             = State.Add;
                        }
                    }
                    else if (GUILayout.Button("Delete", GUILayout.Width(100)))
                    {
                        GUI.FocusControl(null);

                        if (EditorUtility.DisplayDialog("Warning!", "Are you sure you want to delete " + _model.ListName + "?", "Yes", "No"))
                        {
                            _data.RemoveModelDataAt(_currentModelID, _selectedModelDataIndex);
                            EditorUtility.SetDirty(_data);
                            _model = null;
                            _state = State.Blank;
                        }
                    }
                }

                EditorGUILayout.EndHorizontal();
            }
        }
        protected void RenderArrayField(FieldInfo field, DataField attribute, string[] options = null, int[] values = null, System.Type modelType = null)
        {
            System.Array array            = field.GetValue(this) as System.Array;
            System.Type  arrayElementType = field.FieldType.GetElementType();

            if (array == null)
            {
                array = System.Array.CreateInstance(arrayElementType, 0);
            }

            var   listType = typeof(List <>).MakeGenericType(arrayElementType);
            IList list     = (IList)System.Activator.CreateInstance(listType);

            for (int i = 0; i < array.Length; i++)
            {
                list.Add(array.GetValue(i));
            }

            if (list.Count == 0)
            {
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.PrefixLabel(attribute.EditorLabel + string.Format(" ({0:N0})", list.Count));
            }

            int    indexToRemove = -1;
            string label         = "";

            for (int i = 0; i < list.Count; i++)
            {
                label = string.Format("Element {0:D}", i);
                EditorGUILayout.BeginHorizontal();

                if (i == 0)
                {
                    EditorGUILayout.PrefixLabel(attribute.EditorLabel + string.Format(" ({0:N0})", list.Count));
                }
                else
                {
                    GUILayout.Space(EditorGUIUtility.labelWidth);
                }

                if (arrayElementType == typeof(string))
                {
                    list[i] = EditorGUILayout.TextField(label, list[i] as string);
                }
                else if (arrayElementType == typeof(Color))
                {
                    list[i] = EditorGUILayout.ColorField(label, (Color)list[i]);
                }
                else if (arrayElementType == typeof(int))
                {
                    if (options != null && values != null)
                    {
                        int newValue = EditorGUILayout.IntPopup(label, int.Parse(list[i].ToString()), options, values);
                        list[i] = newValue;

                        MethodInfo method = DataRererence.GetType().GetMethod("GetModels", BindingFlags.Instance | BindingFlags.Public);
                        method = method.MakeGenericMethod(modelType);
                        System.Array models = method.Invoke(DataRererence, new object[] {  }) as System.Array;

                        for (int index = 0; index < models.Length; index++)
                        {
                            IGameDataModel model = models.GetValue(index) as IGameDataModel;
                            if (model != null && model.ID.Equals(newValue))
                            {
                                model.RenderPreviewForForeignKey();
                            }
                        }

                        if (GUILayout.Button("Open", GUILayout.MaxWidth(40)))
                        {
                            method = DataRererence.GetType().GetMethod("RegisterOpenModelRequest", BindingFlags.Instance | BindingFlags.Public);
                            method = method.MakeGenericMethod(modelType);
                            method.Invoke(DataRererence, new object[] { newValue });
                        }
                    }
                    else
                    {
                        UnityEngine.RangeAttribute rangeAttr = GetAttribute <UnityEngine.RangeAttribute>(field);

                        if (rangeAttr != null)
                        {
                            list[i] = EditorGUILayout.IntSlider(label, (int)list[i], Mathf.FloorToInt(rangeAttr.min), Mathf.FloorToInt(rangeAttr.max));
                        }
                        else
                        {
                            list[i] = EditorGUILayout.IntField(label, (int)list[i]);
                        }
                    }
                }
                else if (arrayElementType == typeof(float))
                {
                    UnityEngine.RangeAttribute rangeAttr = GetAttribute <UnityEngine.RangeAttribute>(field);

                    if (rangeAttr != null)
                    {
                        list[i] = EditorGUILayout.Slider(label, (float)list[i], rangeAttr.min, rangeAttr.max);
                    }
                    else
                    {
                        list[i] = EditorGUILayout.FloatField(label, (float)list[i]);
                    }
                }
                else if (arrayElementType == typeof(bool))
                {
                    list[i] = EditorGUILayout.Toggle(label, (bool)list[i]);
                }
                else if (arrayElementType == typeof(AnimationCurve))
                {
                    list[i] = EditorGUILayout.CurveField(label, (AnimationCurve)list[i]);
                }
                else if (arrayElementType.IsEnum)
                {
                    System.Enum newValue = EditorGUILayout.EnumPopup(label, (System.Enum)System.Enum.Parse(list[i].GetType(), list[i].ToString()));
                    list[i] = System.Convert.ChangeType(newValue, System.Enum.GetUnderlyingType(list[i].GetType()));
                }
                else if (arrayElementType.GetInterface(typeof(IGameDataModel).Name) != null)
                {
                    EditorGUILayout.LabelField(label, EditorStyles.boldLabel);

                    IGameDataModel model = list[i] as IGameDataModel;
                    model.SetDataReference(DataRererence);
                    EditorGUILayout.BeginVertical();
                    model.RenderForm(true);
                    EditorGUILayout.EndVertical();
                }
                else
                {
                    EditorGUILayout.LabelField(label, "Field type is not supported");
                }

                if (GUILayout.Button("-", GUILayout.MaxWidth(20)))
                {
                    if (EditorUtility.DisplayDialog("Warning!", "Are you sure?", "Yes", "No"))
                    {
                        indexToRemove = i;
                    }
                }

                EditorGUILayout.EndHorizontal();
            }

            if (indexToRemove >= 0)
            {
                list.RemoveAt(indexToRemove);
            }

            if (list.Count == 0)
            {
                if (GUILayout.Button("+", GUILayout.MaxWidth(20)))
                {
                    list.Add(System.Activator.CreateInstance(arrayElementType));
                }
                EditorGUILayout.EndHorizontal();
            }
            else
            {
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.Space();

                if (GUILayout.Button("+", GUILayout.MaxWidth(20)))
                {
                    list.Add(System.Activator.CreateInstance(arrayElementType));
                }

                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.Space();

            System.Array newArray = System.Array.CreateInstance(arrayElementType, list.Count);

            for (int i = 0; i < list.Count; i++)
            {
                newArray.SetValue(list[i], i);
            }

            field.SetValue(this, newArray);
        }
Exemple #16
0
        public void Init(TypeDataModel type, IGameDataModel gameData)
        {
            gameData.Init();

            _data.Add(type, gameData.GetData());
        }
        protected virtual void OverrideField(object target, FieldInfo[] fields, string fieldname, JsonData value)
        {
            foreach (FieldInfo field in fields)
            {
                if (field.Name.Equals(fieldname))
                {
                    try
                    {
                        if (value.IsInt || value.IsLong)
                        {
                            field.SetValue(target, int.Parse(value.ToString()));
                        }
                        else if (value.IsBoolean)
                        {
                            field.SetValue(target, bool.Parse(value.ToString()));
                        }
                        else if (value.IsDouble)
                        {
                            field.SetValue(target, float.Parse(value.ToString()));
                        }
                        else if (value.IsString)
                        {
                            field.SetValue(target, value.ToString());
                        }
                        else if (value.IsArray)
                        {
                            System.Array array = System.Array.CreateInstance(field.FieldType.GetElementType(), value.Count);

                            for (int i = 0; i < value.Count; i++)
                            {
                                object      newObject       = System.Activator.CreateInstance(field.FieldType.GetElementType());
                                FieldInfo[] subobjectFields = GetFields(newObject as IGameDataModel);
                                JsonData    subobjectData   = JsonMapper.ToObject(value[i].ToJson());

                                foreach (string key in subobjectData.Keys)
                                {
                                    OverrideField(newObject, subobjectFields, key, subobjectData[key]);
                                }

                                array.SetValue(newObject, i);
                            }

                            field.SetValue(target, array);
                        }
                        else if (value.IsObject)
                        {
                            if (field.FieldType.GetInterface(typeof(IGameDataModel).Name) != null)
                            {
                                IGameDataModel newObject = System.Activator.CreateInstance(field.FieldType) as IGameDataModel;
                                newObject.OverrideValuesFrom(value.ToJson());

                                field.SetValue(target, newObject);
                            }
                            else if (value.Keys.Contains("m_Curve"))
                            {
                                AnimationCurve curve = new AnimationCurve();

                                JsonData keys = value["m_Curve"];

                                for (int i = 0; i < keys.Count; i++)
                                {
                                    Keyframe frame = new Keyframe();
                                    frame.time        = float.Parse(keys[i]["time"].ToString());
                                    frame.value       = float.Parse(keys[i]["value"].ToString());
                                    frame.inTangent   = float.Parse(keys[i]["inSlope"].ToString());
                                    frame.outTangent  = float.Parse(keys[i]["outSlope"].ToString());
                                    frame.tangentMode = int.Parse(keys[i]["tangentMode"].ToString());

                                    curve.AddKey(frame);
                                }

                                field.SetValue(target, curve);
                            }
                        }
                    }
                    catch (System.Exception e)
                    {
                        Debug.Log(e.ToString());
                    }
                    break;
                }
            }
        }
Exemple #18
0
        private bool DoesModelPassFilters(int modelID, IGameDataModel modelData)
        {
            List <GameDataModelFilter> filters = null;

            if (_filters.ContainsKey(modelID))
            {
                filters = _filters[modelID];
            }
            else
            {
                return(true);
            }

            FieldInfo[] fields = GameDataModel.GetFields(modelData.GetType());
            object[]    attrs  = null;
            foreach (FieldInfo field in fields)
            {
                attrs = field.GetCustomAttributes(typeof(DataField), true);
                foreach (object attr in attrs)
                {
                    DataField fieldAttr = attr as DataField;
                    if (fieldAttr != null && fieldAttr.useForFiltering)
                    {
                        object value = field.GetValue(modelData);

                        foreach (GameDataModelFilter filter in filters)
                        {
                            if (filter.PropertyName != null && filter.PropertyName.Equals(field.Name))
                            {
                                if (field.FieldType == typeof(string))
                                {
                                    if (!filter.CompareToString(value))
                                    {
                                        return(false);
                                    }
                                }
                                else if (field.FieldType == typeof(int))
                                {
                                    if (!filter.CompareToInt(value))
                                    {
                                        return(false);
                                    }
                                }
                                else if (field.FieldType == typeof(float))
                                {
                                    if (!filter.CompareToFloat(value))
                                    {
                                        return(false);
                                    }
                                }
                                else if (field.FieldType == typeof(bool))
                                {
                                    if (!filter.CompareToBool(value))
                                    {
                                        return(false);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(true);
        }
Exemple #19
0
        // We need this method because since 5.3.0 unity no longer
        // supports JsonUtility.FromJson() for ScriptableObjects
        public void ApplyRemoteData(string json)
        {
            float    t         = Time.realtimeSinceStartup;
            JsonData jasonData = JsonMapper.ToObject(json);

            FieldInfo[] fields = GetFields(this);
            foreach (FieldInfo field in fields)
            {
                if (jasonData.Keys.Contains(field.Name))
                {
                    if (field.FieldType.GetInterface("IList") != null)
                    {
                        DataTable dataField = GetTableAttributeForField(field);
                        if (dataField != null)
                        {
                            IList list = field.GetValue(this) as IList;

                            if (list != null)
                            {
                                for (int i = 0; i < jasonData[field.Name].Count; i++)
                                {
                                    try
                                    {
                                        IGameDataModel model = JsonUtility.FromJson(jasonData[field.Name][i].ToJson(), dataField.Type) as IGameDataModel;
                                        if (model != null)
                                        {
                                            bool modelFound = false;
                                            foreach (IGameDataModel currentModel in list)
                                            {
                                                if (currentModel.ID.Equals(model.ID))
                                                {
                                                    modelFound = true;
                                                    currentModel.OverrideValuesFrom(jasonData[field.Name][i].ToJson());
                                                    break;
                                                }
                                            }

                                            if (!modelFound)
                                            {
                                                list.Add(model);
                                            }

                                                                                        #if UNITY_EDITOR
                                            model.SetDataReference(this);
                                                                                        #endif
                                        }
                                    }
                                    catch (System.Exception e)
                                    {
                                        Debug.Log(e.ToString());
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        try
                        {
                            IGameDataModel currentModel = field.GetValue(this) as IGameDataModel;
                            currentModel.OverrideValuesFrom(jasonData[field.Name].ToJson());
                                                        #if UNITY_EDITOR
                            currentModel.SetDataReference(this);
                                                        #endif
                        }
                        catch (System.Exception e)
                        {
                            Debug.Log(e.ToString());
                        }
                    }
                }
            }

            Debug.Log("Merge Time Elapsed: " + (Time.realtimeSinceStartup - t));
        }
 private FieldInfo[] GetFields(IGameDataModel target)
 {
     return(GetFields(target.GetType()));
 }