public static UnitSerializable Serialize(Unit unit)
    {
        UnitSerializable serializedData = new UnitSerializable();

        serializedData.Id       = unit.Id;
        serializedData.UnitName = unit.UnitName;
        serializedData.Team     = unit.Team;

        // Size -1 because we don't need to save the weaponSkill (0)
        serializedData.Skills = new List <int>(unit.Skills.Count - 1);
        for (int i = 1; i < unit.Skills.Count; i++)
        {
            if (unit.Skills[i] != null)
            {
                serializedData.Skills.Add(unit.Skills[i].SkillId);
            }
            else
            {
                serializedData.Skills.Add(0);
            }
        }

        serializedData.AttributesSheet = unit.AttributesSheet;
        serializedData.UnitEquipment   = Serialize(unit.UnitEquipment);
        serializedData.HumanModelInfos = unit.HumanModelInfos;
        serializedData.IsAlive         = unit.IsAlive;
        serializedData.IsPlaying       = unit.IsPlaying;

        if (unit.CurrentCell != null)
        {
            serializedData.CurrentCellX = unit.CurrentCell.X;
            serializedData.CurrentCellZ = unit.CurrentCell.Z;
        }

        serializedData.CurrentRotation = unit.CurrentRotation;
        serializedData.SkillsCooldowns = unit.SkillsCooldowns;
        serializedData.SkillsUses      = unit.SkillsUses;

        return(serializedData);
    }
    public static T Deserialize <T>(UnitSerializable serializedData, Dictionary <string, string> skillsDb, Dictionary <string, string> itemsDb) where T : Unit
    {
        GameObject go   = new GameObject(serializedData.UnitName);
        T          unit = go.AddComponent <T>();

        unit.Id       = serializedData.Id;
        unit.UnitName = serializedData.UnitName;
        unit.Team     = serializedData.Team;

        unit.Skills = new List <SkillBase>(serializedData.Skills.Count + 1);
        unit.Skills.Add(null);
        for (int i = 0; i < serializedData.Skills.Count; i++)
        {
            if (serializedData.Skills[i] != 0)
            {
                string key = serializedData.Skills[i].ToString();
                if (skillsDb.ContainsKey(key))
                {
                    unit.Skills.Add(Resources.Load <ScriptableObject>(skillsDb[key]) as SkillBase);
                }
                else
                {
                    Debug.Log("Deserialize Unit: skillId " + serializedData.Skills[i] + " not found in DB");
                }
            }
        }

        unit.AttributesSheet = serializedData.AttributesSheet;
        unit.UnitEquipment   = Deserialize(serializedData.UnitEquipment, itemsDb);
        unit.HumanModelInfos = serializedData.HumanModelInfos;
        unit.IsAlive         = serializedData.IsAlive;
        unit.IsPlaying       = serializedData.IsPlaying;
        unit.CurrentRotation = serializedData.CurrentRotation;
        unit.SkillsCooldowns = serializedData.SkillsCooldowns;
        unit.SkillsUses      = serializedData.SkillsUses;
        return(unit);
    }