173 lines
4.3 KiB
C#
173 lines
4.3 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class Main : MonoBehaviour
|
|
{
|
|
|
|
[SerializeField] private CellMesh cellMesh;
|
|
|
|
private LogicGrid world;
|
|
int placementValue;
|
|
|
|
bool astarSelected;
|
|
|
|
|
|
// Coordinates for pathfinding
|
|
public Vector2Int agent = new Vector2Int(-1, -1);
|
|
public HashSet<Vector2Int> obstacles = new HashSet<Vector2Int>();
|
|
public HashSet<Vector2Int> samples = new HashSet<Vector2Int>();
|
|
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
// Create world
|
|
int width = 4;
|
|
int height = 4;
|
|
float cellSize = 10f;
|
|
Vector3 origin = new Vector3(-10, -10);
|
|
|
|
world = new LogicGrid(width, height, cellSize, origin);
|
|
|
|
// Set default placement to Obstacle
|
|
placementValue = 1;
|
|
|
|
cellMesh.SetGrid(world);
|
|
|
|
Debug.Log("Loaded. Placing Mode: Obstacle");
|
|
|
|
}
|
|
|
|
// Update contains keyboard shortcut options
|
|
void Update()
|
|
{
|
|
// Change Placement Mode Keyboard Shortcuts:
|
|
////////////////////////////////
|
|
// Place Obstacle in grid
|
|
if (Input.GetKeyDown("o"))
|
|
{
|
|
Debug.Log("Placing Mode: Obstacle");
|
|
placementValue = 1;
|
|
}
|
|
// Place Sample in cell
|
|
if(Input.GetKeyDown("s"))
|
|
{
|
|
Debug.Log("Placing Mode: Sample");
|
|
placementValue = 2;
|
|
}
|
|
// Place agent in cell
|
|
if (Input.GetKeyDown("a"))
|
|
{
|
|
Debug.Log("Placing Mode: Agent");
|
|
placementValue = 3;
|
|
}
|
|
// Reset Canvas
|
|
if (Input.GetKeyDown("r"))
|
|
{
|
|
ResetGrid();
|
|
}
|
|
|
|
if (Input.GetKeyDown("g"))
|
|
{
|
|
StartAlgorithm();
|
|
}
|
|
|
|
//////////////////////////
|
|
|
|
// Update Cell:
|
|
// Place value in cell based on selected placementValue with left click
|
|
if (Input.GetMouseButton(0))
|
|
{
|
|
world.SetValue(CodeMonkey.Utils.UtilsClass.GetMouseWorldPosition(), placementValue);
|
|
}
|
|
// Clear cell with right click
|
|
if (Input.GetMouseButton(1))
|
|
{
|
|
world.SetValue(CodeMonkey.Utils.UtilsClass.GetMouseWorldPosition(), 0);
|
|
}
|
|
}
|
|
|
|
public void SetModeObstacle()
|
|
{
|
|
placementValue = 1;
|
|
}
|
|
public void SetModeSample()
|
|
{
|
|
placementValue = 2;
|
|
}
|
|
public void SetModeAgent()
|
|
{
|
|
placementValue = 3;
|
|
}
|
|
public void ResetGrid()
|
|
{
|
|
world.reset();
|
|
agent = new Vector2Int();
|
|
obstacles = new HashSet<Vector2Int>();
|
|
samples = new HashSet<Vector2Int>();
|
|
}
|
|
|
|
public void StartAlgorithm()
|
|
{
|
|
|
|
Vector2Int coord = new Vector2Int();
|
|
bool agentFound = false;
|
|
|
|
// Collect information about world
|
|
for (int x = 0; x < world.GetWidth(); x++)
|
|
for(int y = 0; y < world.GetHeight(); y++)
|
|
{
|
|
int index = x * world.GetHeight() + y;
|
|
int value = world.GetValue(x, y);
|
|
|
|
//Debug.Log("x: " + x + " y: " + y + " | value: " + value);
|
|
|
|
// Add coordinate to obstacle array
|
|
if (value == 1)
|
|
{
|
|
coord.x = x;
|
|
coord.y = y;
|
|
|
|
if (!obstacles.Contains(coord))
|
|
obstacles.Add(coord);
|
|
}
|
|
// Add coordinate to sample array
|
|
if (value == 2)
|
|
{
|
|
coord.x = x;
|
|
coord.y = y;
|
|
|
|
if (!samples.Contains(coord))
|
|
samples.Add(coord);
|
|
}
|
|
// Add coordinate to agent array
|
|
if (value == 3)
|
|
{
|
|
agent.x = x;
|
|
agent.y = y;
|
|
agentFound = true;
|
|
}
|
|
}
|
|
|
|
if (!agentFound)
|
|
{
|
|
Debug.Log("NO AGENT!");
|
|
return;
|
|
}
|
|
|
|
if (samples.Count == 0)
|
|
{
|
|
Debug.Log("NO SAMPLES!");
|
|
return;
|
|
}
|
|
|
|
if ( true )
|
|
{
|
|
Pathfinder path = new Pathfinder(world, agent, obstacles, samples, 0, 0);
|
|
Stack<Node> result = path.result;
|
|
cellMesh.Animate(result);
|
|
}
|
|
}
|
|
|
|
}
|