/// <summary>
    /// Used for tying a group to a wave
    /// </summary>
    /// <param name="info_"></param>
    /// <returns></returns>
    GroupedWaveInfo CreateGroupedWaveInfo(WaveInfo info_)
    {
        GameObject groupObject = new GameObject("EnemyGroup");

        groupObject.tag = "EnemyGroup";

        groupObject.transform.position = transform.position;

        EnemyGroup spawnedGroup = groupObject.AddComponent <EnemyGroup>();

        GameObject[] defaultTargets = GameObject.FindGameObjectsWithTag(info_.GetDefaultOrderTargetTag());
        float        closest        = 0;
        GameObject   closestTarget  = null;

        foreach (GameObject potentialTarget in defaultTargets)
        {
            if (closestTarget == null || Vector2.SqrMagnitude(transform.position - closestTarget.transform.position) < closest)
            {
                closestTarget = potentialTarget;
                closest       = Vector2.SqrMagnitude(transform.position - closestTarget.transform.position);
            }
        }

        if (closestTarget == null)
        {
            Debug.LogError("Default target is null");
        }

        /// attach order targetting closest target to group
        AIOrder <EnemyGroup> defaultOrder = new AIOrder <EnemyGroup> {
            Orderee = spawnedGroup, ObjectOfInterest = closestTarget
        };

        defaultOrder.AttachCondition(
            delegate(EnemyGroup group, GameObject objectOfInterest, Vector3 pointOfInterest)
        {
            return(objectOfInterest == null);
        });
        defaultOrder.AttachAction(
            delegate(EnemyGroup group, GameObject objectOfInterest, Vector3 pointOfInterest)
        {
            group.CancelCurrentOrder();
            group.OrderAttack(objectOfInterest);
        });
        spawnedGroup.AddDefaultOrder(defaultOrder);


        // set all the objects into an array
        List <GameObject> enemies = new List <GameObject>();

        foreach (WaveEnemyType enemyType in info_.m_enemiesOnWave)
        {
            for (int i = 0; i < enemyType.m_numEnemy; ++i)
            {
                enemies.Add(enemyType.m_enemyRef);
            }
        }

        return(new GroupedWaveInfo {
            group = spawnedGroup, wave = enemies.ToArray()
        });
    }