|
|
|
|
@ -11,8 +11,10 @@ public class Pathfinding : MonoBehaviour {
|
|
|
|
|
[SerializeField] private Transform gridDebugObjectPrefab;
|
|
|
|
|
[SerializeField] private LayerMask obstaclesLayerMask;
|
|
|
|
|
[SerializeField] private LayerMask floorLayerMask;
|
|
|
|
|
[SerializeField] private Transform pathfindingLinkContainer;
|
|
|
|
|
public static Pathfinding Instance { get; private set; }
|
|
|
|
|
private List<GridSystem<PathNode>> GridSystemList { get; set; }
|
|
|
|
|
private List<PathfindingLink> PathfindingLinkList { get; set; }
|
|
|
|
|
|
|
|
|
|
private int Width { get; set; }
|
|
|
|
|
private int Height { get; set; }
|
|
|
|
|
@ -59,6 +61,14 @@ public class Pathfinding : MonoBehaviour {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PathfindingLinkList = new();
|
|
|
|
|
foreach (Transform pathfindinLinkTransform in pathfindingLinkContainer) {
|
|
|
|
|
if (!pathfindinLinkTransform.TryGetComponent(out PathfindingLinkMonoBehaviour pathfindingLinkMonoBehaviour)) continue;
|
|
|
|
|
PathfindingLink pathfindingLink = pathfindingLinkMonoBehaviour.GetPathfindingLink();
|
|
|
|
|
// Debug.Log($"PathfindingLink: {pathfindingLink.GridPositionA} -> {pathfindingLink.GridPositionB}");
|
|
|
|
|
PathfindingLinkList.Add(pathfindingLink);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool IsWalkableGridPosition(GridPosition gridPosition) => GetGridSystem(gridPosition.Floor).GetGridObject(gridPosition).IsWalkable;
|
|
|
|
|
@ -154,14 +164,22 @@ public class Pathfinding : MonoBehaviour {
|
|
|
|
|
List<PathNode> totalNeighbourList = new();
|
|
|
|
|
totalNeighbourList.AddRange(neighbourList);
|
|
|
|
|
|
|
|
|
|
foreach (GridPosition neighbourGridPosition in neighbourList.Select(pathNode => pathNode.GridPosition)) {
|
|
|
|
|
if (neighbourGridPosition.Floor - 1 >= 0) totalNeighbourList.Add(GetNode(neighbourGridPosition.XPosition, neighbourGridPosition.ZPosition, neighbourGridPosition.Floor - 1));
|
|
|
|
|
if (neighbourGridPosition.Floor + 1 < FloorAmount) totalNeighbourList.Add(GetNode(neighbourGridPosition.XPosition, neighbourGridPosition.ZPosition, neighbourGridPosition.Floor + 1));
|
|
|
|
|
}
|
|
|
|
|
IEnumerable<GridPosition> pathfindingLinkGridPositionList = GetPathfindingLinkConnectedGridPositionList(gridPosition);
|
|
|
|
|
totalNeighbourList.AddRange(pathfindingLinkGridPositionList.Select(GetNode));
|
|
|
|
|
|
|
|
|
|
return totalNeighbourList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IEnumerable<GridPosition> GetPathfindingLinkConnectedGridPositionList(GridPosition gridPosition) {
|
|
|
|
|
List<GridPosition> gridPositionList = new();
|
|
|
|
|
foreach (PathfindingLink pathfindingLink in PathfindingLinkList) {
|
|
|
|
|
if (pathfindingLink.GridPositionA == gridPosition) gridPositionList.Add(pathfindingLink.GridPositionB);
|
|
|
|
|
if (pathfindingLink.GridPositionB == gridPosition) gridPositionList.Add(pathfindingLink.GridPositionA);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return gridPositionList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private GridSystem<PathNode> GetGridSystem(int floor) {
|
|
|
|
|
if (floor >= 0 && floor < FloorAmount) return GridSystemList[floor];
|
|
|
|
|
Debug.LogError($"Try to access floor {floor} and has only {GridSystemList.Count} GridSystems in list!");
|
|
|
|
|
@ -169,6 +187,7 @@ public class Pathfinding : MonoBehaviour {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private PathNode GetNode(int x, int z, int floor) => GetGridSystem(floor).GetGridObject(new(x, z, floor));
|
|
|
|
|
private PathNode GetNode(GridPosition gridPosition) => GetGridSystem(gridPosition.Floor).GetGridObject(gridPosition);
|
|
|
|
|
|
|
|
|
|
private static List<GridPosition> CalculatePath(PathNode endNode) {
|
|
|
|
|
List<PathNode> pathNodeList = new() { endNode };
|
|
|
|
|
|