Multi-Floors Pathfinding Links

MultiFloors
Sascha 2023-08-16 10:59:30 +07:00
parent 348e82f70f
commit 1bb64c6b74
13 changed files with 368 additions and 652 deletions

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1278225c3a080127396f090021967166
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

@ -0,0 +1,18 @@
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(PathfindingLinkMonoBehaviour))]
public class PathfindingLinkEditor : Editor {
private void OnSceneGUI() {
PathfindingLinkMonoBehaviour pathfindingLinkMonoBehaviour = (PathfindingLinkMonoBehaviour)target;
EditorGUI.BeginChangeCheck();
Vector3 newLinkPositionA = Handles.PositionHandle(pathfindingLinkMonoBehaviour.LinkPositionA, Quaternion.identity);
Vector3 newLinkPositionB = Handles.PositionHandle(pathfindingLinkMonoBehaviour.LinkPositionB, Quaternion.identity);
if (!EditorGUI.EndChangeCheck()) return;
Undo.RecordObject(pathfindingLinkMonoBehaviour, "Change Link Position");
pathfindingLinkMonoBehaviour.LinkPositionA = newLinkPositionA;
pathfindingLinkMonoBehaviour.LinkPositionB = newLinkPositionB;
}
}

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: eef5642de1af99e2d976de6155441fda

@ -0,0 +1,6 @@
using Grid;
public class PathfindingLink {
public GridPosition GridPositionA;
public GridPosition GridPositionB;
}

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 4dd28b160b7902eabb1c6abe6c48e782

@ -0,0 +1,14 @@
using Grid;
using UnityEngine;
public class PathfindingLinkMonoBehaviour : MonoBehaviour {
public Vector3 LinkPositionA;
public Vector3 LinkPositionB;
public PathfindingLink GetPathfindingLink() {
return new() {
GridPositionA = LevelGrid.Instance.GetGridPosition(LinkPositionA),
GridPositionB = LevelGrid.Instance.GetGridPosition(LinkPositionB),
};
}
}

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 1b5c3d4155bb2e3d3a906744c85a39ac

File diff suppressed because it is too large Load Diff

@ -51,13 +51,13 @@ namespace Actions {
for (int xPosition = -maxMoveDistance; xPosition <= maxMoveDistance; xPosition++) {
for (int zPosition = -maxMoveDistance; zPosition <= maxMoveDistance; zPosition++) {
for (int floor = 0; floor < maxMoveDistance; floor++) {
for (int floor = -maxMoveDistance; floor < maxMoveDistance; floor++) {
GridPosition offsetGridPosition = new(xPosition, zPosition, floor);
GridPosition testGridPosition = unitGridPosition + offsetGridPosition;
if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition)) continue; //Only return valid grid positions
if (unitGridPosition == testGridPosition) continue; //Same grid position where the unit is already at
if (LevelGrid.Instance.HasAnyUnitOnGridPosition(testGridPosition)) continue; //Grid position already accopied with anther unit
if (LevelGrid.Instance.HasAnyUnitOnGridPosition(testGridPosition)) continue; //Grid position already occopied with anther unit
if (!Pathfinding.Instance.IsWalkableGridPosition(testGridPosition)) continue; //Obstacle on path
if (!Pathfinding.Instance.HasPath(unitGridPosition, testGridPosition)) continue; //No path available

@ -32,9 +32,9 @@ namespace Grid {
public GridPosition GetGridPosition(Vector3 worldPosition) => new(Mathf.RoundToInt(worldPosition.x / CellSize), Mathf.RoundToInt(worldPosition.z / CellSize), Floor);
public void CreateDebugObjects(Transform debugPrefab) {
for (int x = 0; x < Width; x++) {
for (int z = 0; z < Height; z++) {
GridPosition gridPosition = new(x, z, Floor);
for (int xPosition = 0; xPosition < Width; xPosition++) {
for (int zPosition = 0; zPosition < Height; zPosition++) {
GridPosition gridPosition = new(xPosition, zPosition, Floor);
Transform debugTransform = Object.Instantiate(debugPrefab, GetWorldPosition(gridPosition), Quaternion.identity);
GridDebugObject gridDebugObject = debugTransform.GetComponent<GridDebugObject>();
gridDebugObject.SetGridObject(GetGridObject(gridPosition));

@ -58,8 +58,9 @@ namespace Grid {
public Vector3 GetWorldPosition(GridPosition gridPosition) => GetGridSystem(gridPosition.Floor).GetWorldPosition(gridPosition);
public bool IsValidGridPosition(GridPosition gridPosition) {
if (gridPosition.Floor < 0 || gridPosition.Floor >= floorAmount) return false;
return GetGridSystem(gridPosition.Floor).IsValidGridPosition(gridPosition);
if (gridPosition.Floor >= 0 && gridPosition.Floor < FloorAmount) return GetGridSystem(gridPosition.Floor).IsValidGridPosition(gridPosition);
// Debug.LogError($"Floor {gridPosition.Floor} is over floorAmount {FloorAmount}");
return false;
}
public int GetWidth() => GetGridSystem(0).Width;

@ -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 };

@ -11,7 +11,7 @@ TagManager:
-
- Water
- UI
- MousePlane
- Floor
- Units
- Obstacles
-