mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-27 20:04:35 +00:00
132 lines
4.9 KiB
C#
132 lines
4.9 KiB
C#
using HPJ.Presentation.Agents;
|
|
using HPJ.Simulation;
|
|
using HPJ.Simulation.Map;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace HPJ.Presentation
|
|
{
|
|
/// <summary>
|
|
/// This sample script is to spawn and control multiple units to see how swarming runs
|
|
/// </summary>
|
|
public class SwarmSample : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private int _testSwarmAmount = 50;
|
|
[SerializeField]
|
|
private SimNavigationAgent _testAgentPrefab;
|
|
[SerializeField]
|
|
private LayerMask _targetLayer;
|
|
|
|
public List<SimNavigationAgent> Agents { get; protected set; }
|
|
|
|
private void Awake()
|
|
{
|
|
Cursor.lockState = CursorLockMode.Confined;
|
|
Cursor.visible = false;
|
|
Agents = new List<SimNavigationAgent>();
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|