From 429920d0830e031d26242dfd8e4933f9e9d099cd Mon Sep 17 00:00:00 2001 From: Janis M Date: Fri, 18 Mar 2022 12:03:36 +0100 Subject: [PATCH] a --- Assets/Scripts/Grid/GridBuildingSystem.cs | 156 ++++++++++++------ Assets/Scripts/Grid/PlacedObject.cs | 2 + Assets/Scripts/Grid/PlacedObjectTypeSO.cs | 2 + Assets/Scripts/Grid/PlacedObjectWayTypeSO.cs | 9 + .../Grid/PlacedObjectWayTypeSO.cs.meta | 11 ++ Assets/Scripts/Pathfinding/Pathfinding.cs | 8 +- 6 files changed, 132 insertions(+), 56 deletions(-) create mode 100644 Assets/Scripts/Grid/PlacedObjectWayTypeSO.cs create mode 100644 Assets/Scripts/Grid/PlacedObjectWayTypeSO.cs.meta diff --git a/Assets/Scripts/Grid/GridBuildingSystem.cs b/Assets/Scripts/Grid/GridBuildingSystem.cs index 20cb119..84d7459 100644 --- a/Assets/Scripts/Grid/GridBuildingSystem.cs +++ b/Assets/Scripts/Grid/GridBuildingSystem.cs @@ -15,6 +15,11 @@ public class GridBuildingSystem : MonoBehaviour PlacedObjectTypeSO selectedPlacedObjectTypeSO; Transform selectedGameObjectTransform; + Vector3 selectedWayStart; + + public List blueprintWayList = new List(); + bool isPlacingWay = false; + public class GridObject { int x, y; @@ -51,63 +56,109 @@ public class GridBuildingSystem : MonoBehaviour void Update() { - UpdateSelectedGameObject(); - - // DEBUG - if (Input.GetKeyDown(KeyCode.U)) + if (selectedGameObjectTransform != null) { - buildingGrid.GetGridObject(Camera.main.ScreenToWorldPoint(Input.mousePosition)).SwitchIsAccessable(); + if (selectedPlacedObjectTypeSO.placedObjectType == PlacedObjectTypeSO.PlacedObjectType.WAY) + { + UpdateWayDrawing(); + } + else + { + UpdateSelectedGameObject(); + } + } + } + + void UpdateWayDrawing() + { + Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); + List dontDeleteBlueprintList = new List(); + + if (isPlacingWay) + { + foreach (Vector3 position in Pathfinding.Instance.FindPath(selectedWayStart, mousePosition, true)) + { + GameObject placedBuilding = PlaceBuilding(position); + if (placedBuilding != null) + { + placedBuilding.GetComponent().isBlueprint = true; + dontDeleteBlueprintList.Add(placedBuilding); + blueprintWayList.Add(placedBuilding); + } + else + { + buildingGrid.GetXY(position, out int x, out int y); + PlacedObject tempPlacedObject = buildingGrid.GetGridObject(x, y).GetPlacedObject(); + if (tempPlacedObject.isBlueprint) + { + dontDeleteBlueprintList.Add(tempPlacedObject.gameObject); + } + } + } + + } + + foreach(GameObject blueprint in blueprintWayList) + { + if (!dontDeleteBlueprintList.Contains(blueprint)) + { + Destroy(blueprint); + } } - if (Input.GetKeyDown(KeyCode.F)) + if (Input.GetMouseButtonDown(0)) { - buildingGrid.GetGridObject(Camera.main.ScreenToWorldPoint(Input.mousePosition)).GetPlacedObject(); + if (isPlacingWay) + { + // PLACE EVERYTHING + foreach (GameObject blueprint in blueprintWayList) + { + blueprint.GetComponent().isBlueprint = false; + blueprintWayList.Remove(blueprint); + } + isPlacingWay = false; + } + else + { + isPlacingWay = true; + selectedWayStart = mousePosition; + } } - } void UpdateSelectedGameObject() { - if (selectedGameObjectTransform != null) + Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); + + buildingGrid.GetXY(mousePosition, out int x, out int y); + + selectedGameObjectTransform.position = buildingGrid.GetWorldPosition(x, y); + + List gridPositionList = selectedPlacedObjectTypeSO.GetGridPositionList(new Vector2Int(x, y)); + if (!CanBuild(gridPositionList)) { - Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); - - buildingGrid.GetXY(mousePosition, out int x, out int y); - - selectedGameObjectTransform.position = buildingGrid.GetWorldPosition(x, y); - - List gridPositionList = selectedPlacedObjectTypeSO.GetGridPositionList(new Vector2Int(x, y)); - if (!CanBuild(gridPositionList)) - { - selectedGameObjectTransform.gameObject.GetComponent().color = Color.red; - } - else - { - selectedGameObjectTransform.gameObject.GetComponent().color = Color.white; - } - - if(selectedPlacedObjectTypeSO.placedObjectType == PlacedObjectTypeSO.PlacedObjectType.WAY) - { - if (Input.GetMouseButton(0)) - { - PlaceBuilding(); - } - } - else - { - if (Input.GetMouseButtonDown(0)) - { - PlaceBuilding(); - } - } - - if (Input.GetMouseButtonDown(1) || Input.GetKeyDown(KeyCode.Escape)) - { - DeselectBuilding(); - } - + selectedGameObjectTransform.gameObject.GetComponent().color = Color.red; } + else if (selectedPlacedObjectTypeSO.placedObjectType != PlacedObjectTypeSO.PlacedObjectType.WAY) + { + selectedGameObjectTransform.gameObject.GetComponent().color = Color.white; + } + + if (Input.GetMouseButtonDown(0)) + { + + PlaceBuilding(selectedGameObjectTransform.position); + } + + + if (Input.GetMouseButtonDown(1) || Input.GetKeyDown(KeyCode.Escape)) + { + DeselectBuilding(); + } + + } + public void DemolishBuilding(Vector3 position) { GridObject gridObject = buildingGrid.GetGridObject(position); // Camera.main.ScreenToWorldPoint(Input.mousePosition) @@ -141,12 +192,11 @@ public class GridBuildingSystem : MonoBehaviour return canBuild; } - public void PlaceBuilding() + public GameObject PlaceBuilding(Vector3 position) { - Vector3 position = selectedGameObjectTransform.position; - - Vector3 mousePosition = new Vector3(position.x, position.y); - buildingGrid.GetXY(mousePosition, out int x, out int y); + Debug.Log("HALLO"); + position = new Vector3(position.x, position.y); + buildingGrid.GetXY(position, out int x, out int y); List gridPositionList = selectedPlacedObjectTypeSO.GetGridPositionList(new Vector2Int(x, y)); @@ -160,12 +210,13 @@ public class GridBuildingSystem : MonoBehaviour { buildingGrid.GetGridObject(gridPosition.x, gridPosition.y).SetPlacedObject(placedObject); } - + return placedObject.gameObject; } else { - Debug.Log("Cannot build here!" + " " + mousePosition); + Debug.Log("Cannot build here!" + " " + position); } + return null; } public void SelectBuilding(PlacedObjectTypeSO placedObjectTypeSO) @@ -180,6 +231,7 @@ public class GridBuildingSystem : MonoBehaviour Destroy(selectedGameObjectTransform.gameObject); selectedPlacedObjectTypeSO = null; selectedGameObjectTransform = null; + isPlacingWay = false; } } diff --git a/Assets/Scripts/Grid/PlacedObject.cs b/Assets/Scripts/Grid/PlacedObject.cs index 886b910..785236c 100644 --- a/Assets/Scripts/Grid/PlacedObject.cs +++ b/Assets/Scripts/Grid/PlacedObject.cs @@ -14,6 +14,7 @@ public abstract class PlacedObject : MonoBehaviour placedObject.origin = origin; placedObject.OnPlace(); + placedObject.isBlueprint = false; if (placedObjectTypeSO.isWalkable) { @@ -30,6 +31,7 @@ public abstract class PlacedObject : MonoBehaviour PlacedObjectTypeSO placedObjectTypeSO; Vector2Int origin; + public bool isBlueprint = true; public abstract void OnPlace(); public List GetGridPositionList() diff --git a/Assets/Scripts/Grid/PlacedObjectTypeSO.cs b/Assets/Scripts/Grid/PlacedObjectTypeSO.cs index fbb2165..04c103b 100644 --- a/Assets/Scripts/Grid/PlacedObjectTypeSO.cs +++ b/Assets/Scripts/Grid/PlacedObjectTypeSO.cs @@ -32,4 +32,6 @@ public class PlacedObjectTypeSO : ScriptableObject return gridPositionList; } + + } diff --git a/Assets/Scripts/Grid/PlacedObjectWayTypeSO.cs b/Assets/Scripts/Grid/PlacedObjectWayTypeSO.cs new file mode 100644 index 0000000..dd02e7d --- /dev/null +++ b/Assets/Scripts/Grid/PlacedObjectWayTypeSO.cs @@ -0,0 +1,9 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class PlacedObjectWayTypeSO : PlacedObjectTypeSO +{ + + +} diff --git a/Assets/Scripts/Grid/PlacedObjectWayTypeSO.cs.meta b/Assets/Scripts/Grid/PlacedObjectWayTypeSO.cs.meta new file mode 100644 index 0000000..9bea826 --- /dev/null +++ b/Assets/Scripts/Grid/PlacedObjectWayTypeSO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7294d731521cbb34b968ca0855ad1e74 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Pathfinding/Pathfinding.cs b/Assets/Scripts/Pathfinding/Pathfinding.cs index b58420f..d29a66a 100644 --- a/Assets/Scripts/Pathfinding/Pathfinding.cs +++ b/Assets/Scripts/Pathfinding/Pathfinding.cs @@ -22,11 +22,11 @@ public class Pathfinding { return grid; } - public List FindPath(Vector3 startWorldPosition, Vector3 endWorldPosition) { + public List FindPath(Vector3 startWorldPosition, Vector3 endWorldPosition, bool ignoreIsWalkable = false) { grid.GetXY(startWorldPosition, out int startX, out int startY); grid.GetXY(endWorldPosition, out int endX, out int endY); - List path = FindPath(startX, startY, endX, endY); + List path = FindPath(startX, startY, endX, endY, ignoreIsWalkable); if (path == null) { return null; } else { @@ -38,7 +38,7 @@ public class Pathfinding { } } - public List FindPath(int startX, int startY, int endX, int endY) { + public List FindPath(int startX, int startY, int endX, int endY, bool ignoreIsWalkable = false) { PathNode startNode = grid.GetGridObject(startX, startY); PathNode endNode = grid.GetGridObject(endX, endY); @@ -75,7 +75,7 @@ public class Pathfinding { foreach (PathNode neighbourNode in GetNeighbourList(currentNode)) { if (closedList.Contains(neighbourNode)) continue; - if (!neighbourNode.isWalkable) { + if (!neighbourNode.isWalkable && !ignoreIsWalkable) { // If neighbouring node is not walkable instantly add them to closed closedList.Add(neighbourNode); continue; }