IEnumerator UpdateEnemySquadClusters() { for (int x = 0; x < enemyContainer.transform.childCount; x++) { GameObject squadObj1 = enemyContainer.transform.GetChild(x).gameObject; if (squadObj1.gameObject.activeSelf) { Squad squad1 = squadObj1.GetComponent <Squad>(); if (squad1 != null) { squad1.cluster = null; } } } // Scrap existing clusters counter++; if (makeScreenshots) { ScreenCapture.CaptureScreenshot("screenshot #" + counter + ".png", 2); } enemySquadClusters = new System.Collections.Generic.List <SquadCluster>(); // Check all enemy squads for (int x = 0; x < enemyContainer.transform.childCount; x++) { GameObject squadObj1 = enemyContainer.transform.GetChild(x).gameObject; if (!squadObj1.gameObject.activeSelf) { continue; } Squad squad1 = squadObj1.GetComponent <Squad>(); if (squad1.cluster != null) { continue; } // Get all squadClusters which are near enough var nearSquads = new System.Collections.Generic.List <Squad>(); var nearClusters = new System.Collections.Generic.List <SquadCluster>(); float minimumDistance = squadObj1.GetComponent <Squad>().movementRadius + allyDistance; // Check for (int y = 0; y < enemyContainer.transform.childCount; y++) { GameObject squadObj2 = enemyContainer.transform.GetChild(y).gameObject; if (squadObj1 == squadObj2 || !squadObj2.gameObject.activeSelf) { continue; } Squad squad2 = squadObj2.GetComponent <Squad>(); // Test if near enough float distance = (squad2.GetPosition() - squad1.GetPosition()).magnitude - squad2.movementRadius; if (distance < minimumDistance) { nearSquads.Add(squad2); if (squad2.cluster != null) { nearClusters.Add(squad2.cluster); } } } if (nearSquads.Count == 0) { continue; } if (nearClusters.Count == 0) { // Create new cluster SquadCluster cluster = new SquadCluster(nearSquads, 1); cluster.Add(squad1); enemySquadClusters.Add(cluster); } else if (nearClusters.Count == 1) { // Add to cluster nearClusters[0].AddRange(nearSquads); nearClusters[0].Add(squad1); } else { // Merge existing entityClusters and add object MergeSquadClusters(nearClusters); nearClusters[0].AddRange(nearSquads); nearClusters[0].Add(squad1); } } // Debug foreach (SquadCluster cluster in enemySquadClusters) { foreach (Transform squad1 in cluster) { foreach (Transform squad2 in cluster) { Debug.DrawLine(squad1.GetComponent <Squad>().GetPosition(), squad2.GetComponent <Squad>().position, Color.gray, SquadClusterUpdatesEverySeconds); } } } counter2 = enemySquadClusters.Count; // recurse yield return(new WaitForSeconds(SquadClusterUpdatesEverySeconds)); StartCoroutine(UpdateEnemySquadClusters()); }
IEnumerator UpdateFriendlySquadClusters() { if (!isPlayerDead && player.GetComponent <Squad>().cluster != null) { player.GetComponent <Squad>().cluster = null; } for (int x = 0; x < friendContainer.transform.childCount; x++) { GameObject squadObj1 = friendContainer.transform.GetChild(x).gameObject; if (squadObj1.gameObject.activeSelf) { Squad squad1 = squadObj1.GetComponent <Squad>(); if (squad1 != null) { squad1.cluster = null; } } } // Scrap existing clusters if (friendSquadClusters != null) { foreach (SquadCluster cluster in friendSquadClusters) { for (var i = 0; i < cluster.Count; i++) { // potential loop try { Transform squad = cluster[i]; if (squad == null) { //cluster.RemoveSquad(squad); //i--; continue; } squad.GetComponent <Squad>().cluster = null; } catch (Exception e) { Debug.LogError(e); } } } } friendSquadClusters = new System.Collections.Generic.List <SquadCluster>(); // Check all friendly squads (and player) for (int x = -1; x < friendContainer.transform.childCount; x++) { if (isPlayerDead && x == -1) { continue; } GameObject squadObj1; if (x == -1) // also add player as a friend { squadObj1 = GameMaster.player.gameObject; } else { squadObj1 = friendContainer.transform.GetChild(x).gameObject; } if (squadObj1 == null || !squadObj1.gameObject.activeSelf) { continue; } Squad squad1 = squadObj1.GetComponent <Squad>(); if (squad1 == null || squad1.cluster != null) { continue; } // Get all squadClusters which are near enough var nearSquads = new System.Collections.Generic.List <Squad>(); var nearClusters = new System.Collections.Generic.List <SquadCluster>(); float minimumDistance = squadObj1.GetComponent <Squad>().movementRadius + allyDistance; // Check for (int y = 0; y < friendContainer.transform.childCount; y++) { GameObject squadObj2 = friendContainer.transform.GetChild(y).gameObject; if (squadObj1 == squadObj2 || !squadObj2.gameObject.activeSelf) { continue; } Squad squad2 = squadObj2.GetComponent <Squad>(); // Test if near enough float distance = (squad2.GetPosition() - squad1.GetPosition()).magnitude - squad2.movementRadius; if (distance < minimumDistance) { nearSquads.Add(squad2); if (squad2.cluster != null) { nearClusters.Add(squad2.cluster); } } } if (nearSquads.Count == 0) { continue; } if (nearClusters.Count == 0) { // Create new cluster SquadCluster cluster = new SquadCluster(nearSquads, 0); cluster.Add(squad1); friendSquadClusters.Add(cluster); } else if (nearClusters.Count == 1) { // Add to cluster nearClusters[0].AddRange(nearSquads); nearClusters[0].Add(squad1); } else { // Merge existing entityClusters and add object MergeSquadClusters(nearClusters); nearClusters[0].AddRange(nearSquads); nearClusters[0].Add(squad1); } } // Debug foreach (SquadCluster cluster in friendSquadClusters) { foreach (Transform squad1 in cluster) { foreach (Transform squad2 in cluster) { Debug.DrawLine(squad1.GetComponent <Squad>().GetPosition(), squad2.GetComponent <Squad>().position, Color.gray, SquadClusterUpdatesEverySeconds); } } } counter1 = friendSquadClusters.Count; // recurse yield return(new WaitForSeconds(SquadClusterUpdatesEverySeconds)); StartCoroutine(UpdateFriendlySquadClusters()); }