/// <summary>
    /// Creates random units for the wave
    /// </summary>
    /// <param name="wave"></param>
    /// <param name="totalEnemies"></param>
    void CreateRandomWave(int level, int totalEnemies)
    {
        // Keeps track of stats built for a specific unit type so that
        // all units of that types share the same stats
        Dictionary <string, LevelUpMetada> levelData = new Dictionary <string, LevelUpMetada>();

        for (int i = 0; i < totalEnemies; i++)
        {
            // Select a random unit to create
            int       index = UnityEngine.Random.Range(0, m_baseUnits.Count);
            EnemyUnit unit  = BuildUnit(m_baseUnits[index].GetType().Name);

            if (unit != null)
            {
                // Because stats are initialized on unit creation with random base values
                // we want to zero them out so that each unit of the same type has the same values
                unit.Stats.SetStatsToZero();

                if (!levelData.ContainsKey(unit.name))
                {
                    levelData[unit.name] = unit.CreateLevelUp(level);
                }

                LevelUpMetada data = levelData[unit.name];
                unit.LevelUp(data);

                m_waveQueue.Enqueue(unit);
            }
        }
    }
    /// <summary>
    /// Creates the next unit waiting to be shown for the first time
    /// </summary>
    /// <param name="wave"></param>
    /// <param name="totalEnemies"></param>
    void DequeueBaseUnit(int wave, int level, int totalEnemies)
    {
        Type nextType = m_nextType[wave - 1];

        Dictionary <string, LevelUpMetada> levelData = new Dictionary <string, LevelUpMetada>();

        for (int i = 0; i < totalEnemies; i++)
        {
            EnemyUnit unit = BuildUnit(nextType.Name);

            if (unit != null)
            {
                // Because stats are initialized on unit creation with random base values
                // we want to zero them out so that each unit of the same type has the same values
                unit.Stats.SetStatsToZero();

                if (!levelData.ContainsKey(unit.name))
                {
                    levelData[unit.name] = unit.CreateLevelUp(level);
                }

                LevelUpMetada data = levelData[unit.name];

                unit.LevelUp(data);

                // Ensure we are using the max health from the level up
                // as well as setting the starting HP to the max HP
                unit.Stats[StatsId.HP_Max] = data.stats[StatsId.HP_Max];
                unit.Stats[StatsId.HP_Cur] = unit.Stats[StatsId.HP_Max];

                // Trigger stats change to update the health bars
                unit.Stats = unit.Stats;

                m_waveQueue.Enqueue(unit);
            }
        }
    }