public GameObject SpawnHero(TeamName team, GameObject teamGroup, GameObject unitSlot)
        {
            // Get monster data from index
            HeroInfo heroInfo = GameManager.Instance.GetHeroData.heroWrapper.HeroData.HeroInfo;

            GameObject heroGO = GameObject.Instantiate(heroTemplateGO, unitSlot.transform.position, Quaternion.identity, teamGroup.transform) as GameObject;

            heroGO.name = heroInfo.PlayerName;
            if (team == TeamName.Friendly)
            {
                heroGO.GetComponent <Hero>().SetMonsterSprite(monsterSprites[heroInfo.FriendlySpriteName]);
            }
            else
            {
                Debug.Log("TEAM name not correct!!!!");
            }
            heroGO.GetComponent <Hero>().SetTeam(team);
            heroGO.GetComponent <Hero>().SetUnitSlot(unitSlot);

            // Set Monster's ability
            List <Ability> abilities = new List <Ability>();

            if (heroInfo.baseActions.Abilities.Count > 0)
            {
                foreach (var action in heroInfo.baseActions.Abilities)
                {
                    abilities.Add(CreateAbilityFromData(action));
                }
            }
            else
            {
                Debug.LogError("No Base abilities set for the hero, something may have gone wrong!");
            }
            heroGO.GetComponent <Hero>().SetMonsterAbilities(abilities);

            #region Set up Hero's Menus
            List <ActionMenu> menus = new List <ActionMenu>();
            // Summon Menu - Should only contain 1 ability
            if (heroInfo.SummonActions.Abilities.Count == 1)
            {
                menus.Add(PopulateHeroSummonMenu(heroInfo));
            }
            // Item Menu
            if (heroInfo.ConsumableActions.Consumables.Count > 0)
            {
                List <Ability> menuAbilities = new List <Ability>();
                foreach (var consumable in heroInfo.ConsumableActions.Consumables)
                {
                    menuAbilities.Add(CreateConsumableAbilityFromData(consumable.Name, consumable.Charges));
                }
                ActionMenu ItemMenu = new ActionMenu(heroInfo.ConsumableActions.Name, menuAbilities);
                menus.Add(ItemMenu);
            }
            // Spells Menu
            if (heroInfo.SpellActions.Abilities.Count > 0)
            {
                List <Ability> menuAbilities = new List <Ability>();
                foreach (var ability in heroInfo.SpellActions.Abilities)
                {
                    menuAbilities.Add(CreateAbilityFromData(ability));
                }
                ActionMenu spellMenu = new ActionMenu(heroInfo.SpellActions.Name, menuAbilities);
                menus.Add(spellMenu);
            }
            // TODO... add this
            heroGO.GetComponent <Hero>().SetMenus(menus);
            #endregion

            // Set Hero HP, MP + Stats
            // HP and Mana specifically Must be set here or the UI at start doesn't update with correct HP/MP
            heroGO.GetComponent <Hero>().SetupHero(heroInfo);
            // Set Character Unique ID
            heroGO.GetComponent <Hero>().SetUniqueID(heroInfo.UniqueID);

            // Trigger Unit Spawn Event Callback
            EventCallbacks.UnitSpawnEventInfo usei = new EventCallbacks.UnitSpawnEventInfo();
            usei.EventDescription = "Unit " + heroGO.name + " has spawned.";
            usei.UnitGO           = heroGO;
            usei.UnitSlotGO       = unitSlot;
            usei.FireEvent();

            return(heroGO);
        }
        public GameObject SpawnMonster(int index, MonsterInfo mi, TeamName team, GameObject teamGroup, GameObject unitSlot)
        {
            // TODO... the index will not be needed once all monster spawns are driven by player and map driven teams
            MonsterInfo monsterInfo;

            if (index == 0)
            {
                monsterInfo = mi;
            }
            else
            {
                // Get monster data from index
                monsterInfo = MonsterDataReader.GetMonsterFromIndex(index);
            }
            // Keep track of count of each monster type in this fight
            TrackCharacterCount(monsterInfo, team);

            GameObject monsterGO = GameObject.Instantiate(monsterTemplateGO, unitSlot.transform.position, Quaternion.identity, teamGroup.transform) as GameObject;

            monsterGO.name = monsterInfo.MonsterName;// + " " + monsterCounts[team + monsterInfo.MonsterName];
            if (team == TeamName.Friendly)
            {
                monsterGO.GetComponent <Monster>().SetMonsterSprite(monsterSprites[monsterInfo.FriendlySpriteName]);
                monsterGO.GetComponent <Animator>().runtimeAnimatorController = Resources.Load($"BattleResources\\Animations\\Default_Animations\\{monsterInfo.AnnimationController}") as RuntimeAnimatorController;
            }
            else if (team == TeamName.Enemy)
            {
                monsterGO.GetComponent <Monster>().SetMonsterSprite(monsterSprites[monsterInfo.EnemySpriteName]);
                monsterGO.GetComponent <Animator>().runtimeAnimatorController = Resources.Load($"BattleResources\\Animations\\Default_Animations\\Enemy\\Enemy{monsterInfo.AnnimationController}") as RuntimeAnimatorController;
            }
            else
            {
                Debug.Log("TEAM name not correct!!!!");
            }
            monsterGO.GetComponent <Monster>().SetTeam(team);
            monsterGO.GetComponent <Monster>().SetUnitSlot(unitSlot);

            // Set Monster's ability
            List <Ability> abilities = new List <Ability>();

            if (!string.IsNullOrEmpty(monsterInfo.Ability1))
            {
                abilities.Add(CreateAbilityFromData(monsterInfo.Ability1));
            }
            if (!string.IsNullOrEmpty(monsterInfo.Ability2))
            {
                abilities.Add(CreateAbilityFromData(monsterInfo.Ability2));
            }
            if (!string.IsNullOrEmpty(monsterInfo.Ability3))
            {
                abilities.Add(CreateAbilityFromData(monsterInfo.Ability3));
            }
            if (!string.IsNullOrEmpty(monsterInfo.Ability4))
            {
                abilities.Add(CreateAbilityFromData(monsterInfo.Ability4));
            }
            // TODO... what if no abilities?!?
            monsterGO.GetComponent <Monster>().SetMonsterAbilities(abilities);

            // Set monster HP, MP and stats
            // HP and Mana specifically Must be set here or the UI at start doesn't update with correct HP/MP
            monsterGO.GetComponent <Monster>().SetupMonster(monsterInfo);
            // Set Character Unique ID
            monsterGO.GetComponent <Monster>().SetUniqueID(AssignUniqueID(monsterInfo, team));

            // Trigger Unit Spawn Event Callback
            EventCallbacks.UnitSpawnEventInfo usei = new EventCallbacks.UnitSpawnEventInfo();
            usei.EventDescription = "Unit " + monsterGO.name + " has spawned.";
            usei.UnitGO           = monsterGO;
            usei.UnitSlotGO       = unitSlot;
            usei.FireEvent();

            return(monsterGO);
        }