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(); } } } } }