using HPJ.Presentation.Agents;
using HPJ.Simulation;
using HPJ.Simulation.Map;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace HPJ.Presentation
{
///
/// This sample script is to spawn and control multiple units to see how swarming runs
///
public class SwarmSample : MonoBehaviour
{
[SerializeField]
private int _testSwarmAmount = 50;
[SerializeField]
private SimNavigationAgent _testAgentPrefab;
[SerializeField]
private LayerMask _targetLayer;
public List Agents { get; protected set; }
private void Awake()
{
Cursor.lockState = CursorLockMode.Confined;
Cursor.visible = false;
Agents = new List();
}
private void Start()
{
StartCoroutine(RollOut());
}
private IEnumerator RollOut()
{
while (NavigationManager.Instance == null)
{
yield return null;
}
while (!NavigationManager.Instance.Initialized)
{
yield return null;
}
yield return null;
for (int i = 0; i < _testSwarmAmount; i++)
{
Vector3 RandomPosition = NavigationManager.Instance.GetRandomValidPosition(_testAgentPrefab.TraversableTiles, true);
SimNavigationAgent Agent = Instantiate(_testAgentPrefab, RandomPosition, Quaternion.identity);
Agent.transform.SetParent(transform);
Agent?.GroundCast?.TeleportUp();
Agents.Add(Agent);
MapSet map = NavigationManager.Instance.GetCurrentMap(RandomPosition);
Agent.SetCurrentMap(map);
yield return null;
}
}
// Update is called once per frame
void Update()
{
// Calculate the distance from the ray origin to the intersection with the plane
if (Input.GetMouseButtonDown(1))
{
RaycastHit hit;
if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit, 300f, _targetLayer))
{
Vector3 hitPoint = hit.point;
Debug.Log($"Hit Point {hitPoint}");
for (int i = 0; i < Agents.Count; i++)
{
if (Agents[i].CurrentMap != null)
{
if (NavigationManager.Instance.ValidPoint(hitPoint, Agents[i].CurrentMap))
{
IntVector3 TargetDestination = NavigationManager.Instance.GetTileWorldPosition(hitPoint);
Agents[i].Idle();
Agents[i].SetDestination(TargetDestination, true, true);
}
else if (NavigationManager.Instance.ValidPoint(hitPoint, out MapSet HitMap))
{
Agents[i].SetCurrentMap(HitMap);
IntVector3 TargetDestination = NavigationManager.Instance.GetTileWorldPosition(hitPoint);
Agents[i].Idle();
Agents[i].SetDestination(TargetDestination, true, true);
}
}
else
{
Agents[i].SetCurrentMap(NavigationManager.Instance.GetMapAtWorldPosition(Agents[i].transform.position));
if (NavigationManager.Instance.ValidPoint(hitPoint, Agents[i].CurrentMap))
{
IntVector3 TargetDestination = NavigationManager.Instance.GetTileWorldPosition(hitPoint);
Agents[i].Idle();
Agents[i].SetDestination(TargetDestination, true, true);
}
else if (NavigationManager.Instance.ValidPoint(hitPoint, out MapSet HitMap))
{
Agents[i].SetCurrentMap(HitMap);
IntVector3 TargetDestination = NavigationManager.Instance.GetTileWorldPosition(hitPoint);
Agents[i].Idle();
Agents[i].SetDestination(TargetDestination, true, true);
}
}
}
}
else
{
Debug.Log("Did not hit on Raycast");
}
}
else if (Input.GetKeyDown(KeyCode.Escape))
{
for (int i = 0; i < Agents.Count; i++)
{
Agents[i].Idle();
}
}
}
}
}