using System; using Unity.MLAgents; using UnityEngine; public class GameManager : MonoBehaviour { private static GameManager instance; public static GameManager Instance => instance; private static SimpleMultiAgentGroup defendersTeam = new SimpleMultiAgentGroup(); private static SimpleMultiAgentGroup attackersTeam = new SimpleMultiAgentGroup(); private void Awake() { if (instance is null) instance = this; else { Destroy(gameObject); Debug.LogError("Only 1 Instance"); } } private void Start() { Academy.Instance.OnEnvironmentReset += ResetScene; GlobalEventManager.onCaptureFlag += FlagCaptured; GlobalEventManager.onTimeLeft += TimeOut; var agents = GameObject.FindObjectsOfType(); foreach (var item in agents) { var agent = item as NPC; if (agent.GetCharacter.Team == Team.Attackers) attackersTeam.RegisterAgent(item); else defendersTeam.RegisterAgent(item); } } private static SimpleMultiAgentGroup getAgentList(Team team) { if (team == Team.Attackers) return attackersTeam; else return defendersTeam; } public static bool IsCloserToEnemyThanToNextNavPoint(NavPoint navPoint, Vector3 currentTransform, Team oppositeTeam) { var agentGroup = getAgentList(oppositeTeam); var distToNavPoint = (currentTransform - navPoint.Position).magnitude; foreach (var agent in agentGroup.GetRegisteredAgents()) if (distToNavPoint > (currentTransform - agent.transform.position).magnitude) return true; if ((SettingsReader.Instance.GetSettings.HasHumanAttacker == true && oppositeTeam == Team.Attackers) || (SettingsReader.Instance.GetSettings.HasHumanDefender == true && oppositeTeam == Team.Defenders)) { if (distToNavPoint > (currentTransform - CharacterFactory.Instance.player.transform.position).magnitude) return true; } return false; } public static bool IsEnemyNearby(Vector3 currentTransform, Team oppositeTeam) { var agentGroup = getAgentList(oppositeTeam); foreach (var agent in agentGroup.GetRegisteredAgents()) if ((currentTransform - agent.transform.position).magnitude < SettingsReader.Instance.GetSettings.ViewDistance) return true; if ((SettingsReader.Instance.GetSettings.HasHumanAttacker == true && oppositeTeam == Team.Attackers) || (SettingsReader.Instance.GetSettings.HasHumanDefender == true && oppositeTeam == Team.Defenders)) { if ((currentTransform - CharacterFactory.Instance.player.transform.position).magnitude < SettingsReader.Instance.GetSettings.ViewDistance) return true; } return false; } public static bool IsCloserToFlagFromNextNavPoint(NavPoint navPoint, Vector3 currentTransform) => navPoint.FlagDistance < (currentTransform - GameObject.FindGameObjectWithTag("Flag").transform.position).magnitude; public static bool IsHaveSeenByEnemy(Team oppositeTeam, Vector3 position) { var agentGroup = getAgentList(oppositeTeam); RaycastHit rayHit = new RaycastHit(); foreach (var agent in agentGroup.GetRegisteredAgents() ) { var npc = agent as NPC; if (Physics.Raycast(position, (npc.NpcBodyState.GetPointToHit(npc.gameObject) - position).normalized, out rayHit, SettingsReader.Instance.GetSettings.ViewDistance)) { if (rayHit.collider.gameObject.GetComponent() != null) return true; } } if ((SettingsReader.Instance.GetSettings.HasHumanAttacker == true && oppositeTeam == Team.Attackers) || (SettingsReader.Instance.GetSettings.HasHumanDefender == true && oppositeTeam == Team.Defenders)) { var player = CharacterFactory.Instance.player; if (Physics.Raycast(position, (player.GetComponent().bounds.center - position).normalized, out rayHit, SettingsReader.Instance.GetSettings.ViewDistance)) { if (rayHit.collider.gameObject.GetComponent() != null) return true; } } return false; } private void FlagCaptured(Team team) { switch (team) { case Team.Attackers: Debug.Log("Attackers Win"); break; case Team.Defenders: Debug.Log("Defenders Win"); break; } ResetScene(); } private void TimeOut() { ResetScene(); } private void OnDestroy() { GlobalEventManager.onCaptureFlag -= FlagCaptured; GlobalEventManager.onTimeLeft -= TimeOut; } public static event Action OnResetScene; private void ResetScene() { Debug.Log("Scene Reset"); OnResetScene?.Invoke(); } }