mirror of
https://github.com/Xevion/Paths.git
synced 2025-12-14 18:12:26 -06:00
successful implementation of algorithm usage in Manager, random wall/start/end position placement, needs major feature and code cleanup
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using UnityEngine;
|
||||||
|
using Vector2 = System.Numerics.Vector2;
|
||||||
|
|
||||||
namespace Algorithms {
|
namespace Algorithms {
|
||||||
public class AStar : IPathfinding {
|
public class AStar : IPathfinding {
|
||||||
@@ -22,7 +23,6 @@ namespace Algorithms {
|
|||||||
public Stack<Node> FindPath(Vector2 Start, Vector2 End) {
|
public Stack<Node> FindPath(Vector2 Start, Vector2 End) {
|
||||||
this._start = Start;
|
this._start = Start;
|
||||||
this._end = End;
|
this._end = End;
|
||||||
RecordState();
|
|
||||||
|
|
||||||
var start = new Node(Start, true);
|
var start = new Node(Start, true);
|
||||||
var end = new Node(End, true);
|
var end = new Node(End, true);
|
||||||
@@ -31,6 +31,8 @@ namespace Algorithms {
|
|||||||
_path = new Stack<Node>();
|
_path = new Stack<Node>();
|
||||||
_openList = new List<Node>();
|
_openList = new List<Node>();
|
||||||
_closedList = new List<Node>();
|
_closedList = new List<Node>();
|
||||||
|
|
||||||
|
RecordState();
|
||||||
Node current = start;
|
Node current = start;
|
||||||
|
|
||||||
// add start node to Open List
|
// add start node to Open List
|
||||||
|
|||||||
@@ -29,5 +29,9 @@ namespace Algorithms {
|
|||||||
Weight = weight;
|
Weight = weight;
|
||||||
Walkable = walkable;
|
Walkable = walkable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override string ToString() {
|
||||||
|
return $"Node({Position.X}, {Position.Y}, {Walkable})";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
using Random = UnityEngine.Random;
|
||||||
|
|
||||||
namespace Algorithms {
|
namespace Algorithms {
|
||||||
public class NodeGrid {
|
public class NodeGrid {
|
||||||
@@ -64,14 +65,26 @@ namespace Algorithms {
|
|||||||
/// <returns>A Node object</returns>
|
/// <returns>A Node object</returns>
|
||||||
/// <exception cref="ArgumentOutOfRangeException">when the coordinate given does not exist on the grid</exception>
|
/// <exception cref="ArgumentOutOfRangeException">when the coordinate given does not exist on the grid</exception>
|
||||||
public Node GetNode(int x, int y) {
|
public Node GetNode(int x, int y) {
|
||||||
if(!IsValid(x, y))
|
// if(!IsValid(x, y))
|
||||||
throw new ArgumentOutOfRangeException();
|
// throw new ArgumentOutOfRangeException();
|
||||||
|
|
||||||
return this.grid[x][y];
|
return this.grid[x][y];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void FlipRandomWall() {
|
||||||
|
this.grid[Random.Range(0, this.Width - 1)][Random.Range(0, this.Height - 1)].Walkable = false;
|
||||||
|
}
|
||||||
|
|
||||||
public static float Manhattan(Node first, Node second) {
|
public static float Manhattan(Node first, Node second) {
|
||||||
return Math.Abs(first.Position.X - second.Position.X) + Math.Abs(first.Position.Y - second.Position.Y);
|
return Math.Abs(first.Position.X - second.Position.X) + Math.Abs(first.Position.Y - second.Position.Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random Vector2 position within the grid.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>a valid Vector2 position within the grid</returns>
|
||||||
|
public Vector2 RandomPosition() {
|
||||||
|
return new Vector2(Random.Range(0, Width - 1), Random.Range(0, Height - 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,12 +9,13 @@ public enum PropertyName {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A simple Grid Rendering Controller using MeshRenderer.
|
/// A simple Grid Rendering system controlling a Shader through a ComputeBuffer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class GridController : MonoBehaviour {
|
public class GridController : MonoBehaviour {
|
||||||
public Material gridMaterial;
|
public Material gridMaterial; // Maintain reference to the Grid Material the Shader is implanted upon
|
||||||
public int size = 32;
|
public int size = 32; // Size of the grid, width and height
|
||||||
|
|
||||||
|
// Value management
|
||||||
private int[] _values;
|
private int[] _values;
|
||||||
private ComputeBuffer _buffer;
|
private ComputeBuffer _buffer;
|
||||||
|
|
||||||
@@ -60,7 +61,7 @@ public class GridController : MonoBehaviour {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads a GridState
|
/// Loads a GridState into the Grid Shader's StructuredBuffer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="gridState"></param>
|
/// <param name="gridState"></param>
|
||||||
public void LoadGridState(GridState gridState) {
|
public void LoadGridState(GridState gridState) {
|
||||||
@@ -68,6 +69,7 @@ public class GridController : MonoBehaviour {
|
|||||||
foreach(int x in Enumerable.Range(0, gridState.Grid.Count - 1))
|
foreach(int x in Enumerable.Range(0, gridState.Grid.Count - 1))
|
||||||
foreach(int y in Enumerable.Range(0, gridState.Grid[0].Count - 1))
|
foreach(int y in Enumerable.Range(0, gridState.Grid[0].Count - 1))
|
||||||
this.SetValue(x, y, (int) gridState.Grid[x][y]);
|
this.SetValue(x, y, (int) gridState.Grid[x][y]);
|
||||||
|
UpdateShader(PropertyName.Values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,3 +1,11 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: ae862ef271614573a2ecacb6d9fa2078
|
guid: ae862ef271614573a2ecacb6d9fa2078
|
||||||
timeCreated: 1604939699
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 200
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Algorithms;
|
using Algorithms;
|
||||||
@@ -19,26 +20,33 @@ public class GridState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add 'seen' tiles
|
// Add 'seen' tiles
|
||||||
foreach (Node seenNode in seen) {
|
foreach (Node seenNode in seen)
|
||||||
this.Grid[(int) seenNode.Position.X][(int) seenNode.Position.Y] = GridNodeType.Seen;
|
this.Grid[(int) seenNode.Position.X][(int) seenNode.Position.Y] = GridNodeType.Seen;
|
||||||
}
|
|
||||||
|
|
||||||
// Add 'expanded' tiles
|
// Add 'expanded' tiles
|
||||||
foreach (Node expandedNode in expanded) {
|
foreach (Node expandedNode in expanded)
|
||||||
this.Grid[(int) expandedNode.Position.X][(int) expandedNode.Position.Y] = GridNodeType.Expanded;
|
this.Grid[(int) expandedNode.Position.X][(int) expandedNode.Position.Y] = GridNodeType.Expanded;
|
||||||
}
|
|
||||||
|
|
||||||
// Set start and end tiles
|
|
||||||
this.Grid[(int) start.X][(int) start.Y] = GridNodeType.Start;
|
|
||||||
this.Grid[(int) end.X][(int) end.Y] = GridNodeType.End;
|
|
||||||
|
|
||||||
// Add 'path' tiles
|
// Add 'path' tiles
|
||||||
if (path != null)
|
if (path != null)
|
||||||
foreach (Node pathNode in path)
|
foreach (Node pathNode in path)
|
||||||
this.Grid[(int) pathNode.Position.X][(int) pathNode.Position.Y] = GridNodeType.Path;
|
this.Grid[(int) pathNode.Position.X][(int) pathNode.Position.Y] = GridNodeType.Path;
|
||||||
|
|
||||||
|
// Set start and end tiles
|
||||||
|
this.Grid[(int) start.X][(int) start.Y] = GridNodeType.Start;
|
||||||
|
this.Grid[(int) end.X][(int) end.Y] = GridNodeType.End;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<GridNodeType> GetNodes() {
|
public IEnumerable<GridNodeType> GetNodes() {
|
||||||
return this.Grid.SelectMany(nodeList => nodeList).ToList();
|
return this.Grid.SelectMany(nodeList => nodeList).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string RenderGrid() {
|
||||||
|
string result = "";
|
||||||
|
foreach (List<GridNodeType> nodeTypes in this.Grid) {
|
||||||
|
result = nodeTypes.Aggregate(result, (current, nodeType) => current + $"{(int) nodeType}") + "\n";
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
39
Paths/Assets/Scripts/Manager.cs
Normal file
39
Paths/Assets/Scripts/Manager.cs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Numerics;
|
||||||
|
using Algorithms;
|
||||||
|
using Vector2 = System.Numerics.Vector2;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The primary controller of the entire application, managing state, events and sending commands
|
||||||
|
/// </summary>
|
||||||
|
public class Manager : MonoBehaviour {
|
||||||
|
public GridController gridController;
|
||||||
|
private IPathfinding _algorithm;
|
||||||
|
|
||||||
|
public void Start() {
|
||||||
|
var nodeGrid = new NodeGrid(gridController.size, gridController.size);
|
||||||
|
_algorithm = new AStar(nodeGrid);
|
||||||
|
|
||||||
|
Vector2 start = new Vector2(0, 0);
|
||||||
|
Vector2 end = new Vector2(16, 16);
|
||||||
|
|
||||||
|
foreach(int index in Enumerable.Range(0, 150))
|
||||||
|
nodeGrid.FlipRandomWall();
|
||||||
|
|
||||||
|
Stack<Node> path = _algorithm.FindPath(start, end);
|
||||||
|
|
||||||
|
List<GridState> states = _algorithm.GetStates();
|
||||||
|
gridController.LoadGridState(states[states.Count - 1]);
|
||||||
|
Debug.Log(states[states.Count - 1].RenderGrid());
|
||||||
|
Debug.Log(start);
|
||||||
|
Debug.Log(end);
|
||||||
|
|
||||||
|
// StartCoroutine(LateStart());
|
||||||
|
}
|
||||||
|
|
||||||
|
// IEnumerator LateStart() {
|
||||||
|
// }
|
||||||
|
}
|
||||||
11
Paths/Assets/Scripts/Manager.cs.meta
Normal file
11
Paths/Assets/Scripts/Manager.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ca142250b9964eb1adf66ac7c5cc3e3e
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 300
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -33,8 +33,8 @@ Shader "PDT Shaders/TestGrid" {
|
|||||||
float4 _ActiveColor;
|
float4 _ActiveColor;
|
||||||
|
|
||||||
static const float4 _gridColors[7] = {
|
static const float4 _gridColors[7] = {
|
||||||
float4(255 / 255.0, 255 / 255.0, 255 / 255.0, 1.0), // Empty
|
float4(255 / 255.0, 255 / 255.0, 255 / 255.0, 0.0), // Empty
|
||||||
float4(0 / 255.0, 0 / 255.0, 0 / 255.0, 1.0), // Wall
|
float4(50 / 255.0, 50 / 255.0, 50 / 255.0, 1.0), // Wall
|
||||||
float4(0 / 255.0, 255 / 255.0, 0 / 255.0, 1.0), // Start
|
float4(0 / 255.0, 255 / 255.0, 0 / 255.0, 1.0), // Start
|
||||||
float4(255 / 255.0, 0 / 255.0, 0 / 255.0, 1.0), // End
|
float4(255 / 255.0, 0 / 255.0, 0 / 255.0, 1.0), // End
|
||||||
float4(252 / 255.0, 236 / 255.0, 3 / 255.0, 1.0), // Seen
|
float4(252 / 255.0, 236 / 255.0, 3 / 255.0, 1.0), // Seen
|
||||||
@@ -47,7 +47,7 @@ Shader "PDT Shaders/TestGrid" {
|
|||||||
|
|
||||||
// DX11 needed to run shader at high grid sizes
|
// DX11 needed to run shader at high grid sizes
|
||||||
#ifdef SHADER_API_D3D11
|
#ifdef SHADER_API_D3D11
|
||||||
StructuredBuffer<float> _values;
|
StructuredBuffer<int> _values;
|
||||||
#else
|
#else
|
||||||
float _values[1024];
|
float _values[1024];
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user