/// <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() }); }