152 lines
5.5 KiB
C#
Executable File
152 lines
5.5 KiB
C#
Executable File
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<Agent>();
|
|
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<ICharacter>() != 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<MeshRenderer>().bounds.center - position).normalized,
|
|
out rayHit,
|
|
SettingsReader.Instance.GetSettings.ViewDistance))
|
|
{
|
|
if (rayHit.collider.gameObject.GetComponent<ICharacter>() != null)
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void FlagCaptured(Team team)
|
|
{
|
|
switch (team)
|
|
{
|
|
case Team.Attackers:
|
|
Debug.Log("Attackers Win");
|
|
ResetScene();
|
|
break;
|
|
case Team.Defenders:
|
|
Debug.Log("Defenders Win");
|
|
ResetScene();
|
|
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();
|
|
}
|
|
}
|