using System.Collections.Generic; using System; using UnityEngine; public class CharacterSpawner : MonoBehaviour { [SerializeField] private GameObject botPrefab; [SerializeField] private List defendersSpawnPoints; [SerializeField] private List attackersSpawnPoints; private static Dictionary<(TypeAI, Team), Func> behaviourDictionary; private static System.Random random; public void Start() { behaviourDictionary = new Dictionary<(TypeAI, Team), Func>() { { (TypeAI.DumbAlgorithm, Team.Attackers), new Func( npc => new DumbAttacker(npc))}, { (TypeAI.DumbAlgorithm, Team.Defenders), new Func( npc => new DumbDefender(npc)) }, { (TypeAI.HumanAI, Team.Defenders), new Func( npc => new Human(npc))}, { (TypeAI.HumanAI, Team.Attackers), new Func( npc => new Human(npc))}, //And Other behaviours }; if (SettingsReader.Instance.GetSettings.hasHumanAttacker && SettingsReader.Instance.GetSettings.hasHumanDefender) throw new System.Exception("Not allowed to have two players"); else if (SettingsReader.Instance.GetSettings.hasHumanAttacker == true) { spawnCharacter(behaviourDictionary[(TypeAI.HumanAI, Team.Attackers)], Team.Attackers); } else if (SettingsReader.Instance.GetSettings.hasHumanDefender == true) { spawnCharacter(behaviourDictionary[(TypeAI.HumanAI, Team.Defenders)], Team.Defenders); } for (int i = 0; i < SettingsReader.Instance.GetSettings.numOfAttackers - (SettingsReader.Instance.GetSettings.hasHumanAttacker ? 1 : 0); i++) { spawnCharacter(behaviourDictionary[(SettingsReader.Instance.GetSettings.atcTeamAI, Team.Attackers)], Team.Attackers); } for (int i = 0; i < SettingsReader.Instance.GetSettings.numOfAttackers - (SettingsReader.Instance.GetSettings.hasHumanDefender ? 1 : 0); i++) { spawnCharacter(behaviourDictionary[(SettingsReader.Instance.GetSettings.defTeamAI, Team.Defenders)], Team.Defenders); } } private void spawnCharacter(Func behaviourFunc, Team team) { var spawnPoint = team == Team.Defenders ? defendersSpawnPoints[random.Next(0, defendersSpawnPoints.Count)].position : attackersSpawnPoints[random.Next(0, attackersSpawnPoints.Count)].position; var entity = Instantiate(botPrefab, spawnPoint, Quaternion.identity); var npc = entity.GetComponent(); npc.SetBehaviour(behaviourFunc(npc)); } }