diff --git a/Assets/Scenes/Prototype.unity b/Assets/Scenes/Prototype.unity index 2160c8c..843495c 100644 --- a/Assets/Scenes/Prototype.unity +++ b/Assets/Scenes/Prototype.unity @@ -171,6 +171,7 @@ MonoBehaviour: playerLayer: serializedVersion: 2 m_Bits: 0 + pathRequested: [] --- !u!1 &201300560 GameObject: m_ObjectHideFlags: 0 @@ -481,6 +482,7 @@ MonoBehaviour: maxHealth: 100 maxMovement: 10 currentTile: {fileID: 0} + moveAnimSpeed: 2 canMove: 1 invincible: 0 hasMoved: 0 @@ -691,6 +693,7 @@ MonoBehaviour: maxHealth: 100 maxMovement: 120 currentTile: {fileID: 0} + moveAnimSpeed: 0 canMove: 1 invincible: 0 turnSpeed: 1 @@ -1128,6 +1131,7 @@ MonoBehaviour: maxHealth: 100 maxMovement: 3 currentTile: {fileID: 0} + moveAnimSpeed: 2 canMove: 1 invincible: 0 hasMoved: 0 @@ -1311,6 +1315,7 @@ MonoBehaviour: maxHealth: 100 maxMovement: 3 currentTile: {fileID: 0} + moveAnimSpeed: 2 canMove: 1 invincible: 0 hasMoved: 0 diff --git a/Assets/Scripts/EnemyMovement.cs b/Assets/Scripts/EnemyMovement.cs index 2fc4ef4..c09e063 100644 --- a/Assets/Scripts/EnemyMovement.cs +++ b/Assets/Scripts/EnemyMovement.cs @@ -22,7 +22,7 @@ public class EnemyMovement : MonoBehaviour private HashSet visited = new(); private Dictionary currentPaths = new(); - public void PathfindToTarget(TileObject target, Enemy selectedEntity) + public void PathfindToTarget(TileObject target, Entity selectedEntity) { frontier.Clear(); visited.Clear(); @@ -32,7 +32,7 @@ public class EnemyMovement : MonoBehaviour selectedEntity.currentTile = requestedTile; selectedEntity.transform.position = requestedTile.transform.position; } - private void GetTilesInRange(Enemy selectedEntity) + private void GetTilesInRange(Entity selectedEntity) { frontier.Enqueue(selectedEntity.currentTile); while (frontier.Count > 0) @@ -51,7 +51,7 @@ public class EnemyMovement : MonoBehaviour Debug.Log(frontier.Count); } - private TileObject GetPathToTarget(TileObject target, Enemy selectedEntity) + private TileObject GetPathToTarget(TileObject target, Entity selectedEntity) { TileObject currentTile = target; List pathToTarget = new(); diff --git a/Assets/Scripts/Entity.cs b/Assets/Scripts/Entity.cs index f1d0b76..cd393cc 100644 --- a/Assets/Scripts/Entity.cs +++ b/Assets/Scripts/Entity.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using UnityEngine; public class Entity : MonoBehaviour @@ -10,6 +11,7 @@ public class Entity : MonoBehaviour [Header("Movement")] public int maxMovement; public TileObject currentTile; + public float moveAnimSpeed; [Header("Flags")] public bool canMove = true; @@ -34,4 +36,22 @@ public class Entity : MonoBehaviour { } + + public virtual IEnumerator MoveToLocation(TileObject[] pathToMove) + { + float currentState = 0; + int currentTileList = 0; + while (currentTileList < pathToMove.Length) + { + currentState += Time.deltaTime * moveAnimSpeed; + transform.position = Vector2.Lerp(currentTile.transform.position, pathToMove[currentTileList].transform.position, currentState); + if (currentState > 1) + { + currentTile = pathToMove[currentTileList]; + currentState = 0; + currentTileList++; + } + yield return null; + } + } } diff --git a/Assets/Scripts/PlayerEntityMovement.cs b/Assets/Scripts/PlayerEntityMovement.cs index 3ebf19c..1724f71 100644 --- a/Assets/Scripts/PlayerEntityMovement.cs +++ b/Assets/Scripts/PlayerEntityMovement.cs @@ -32,12 +32,12 @@ public class PlayerEntityMovement : MonoBehaviour private float debounceTime; [SerializeField] private float debounceDuration; - - public LayerMask playerLayer; - - private Queue currentMovableTiles = new(); - private Dictionary paths = new(); - private List currentPath = new(); + + private List currentMovableTiles = new(); + private Queue frontier = new(); + private HashSet visited = new(); + private Dictionary currentPaths = new(); + public List pathRequested; private TileObject requestedTile; private void Start() @@ -55,28 +55,19 @@ public class PlayerEntityMovement : MonoBehaviour } if (isMoving) { + if (Input.GetMouseButton(1)) + { + Deselect(); + } TileObject newTile = GridManager.instance.GetTile(mouseGridPos); if (requestedTile != newTile) { requestedTile = newTile; - foreach (TileObject tile in currentPath) + foreach (TileObject tile in pathRequested) { - tile.sprite.color = Color.green; - } - currentPath.Clear(); - if (currentMovableTiles.Contains(requestedTile)) - { - TileObject currentTile = requestedTile; - while (currentTile != selectedEntity.currentTile) - { - currentPath.Add(currentTile); - currentTile = paths[currentTile]; - } - foreach (TileObject tile in currentPath) - { - tile.sprite.color = Color.blue; - } + tile.sprite.color = new Color(137,137,137); } + PathfindToTarget(); } templateObject.transform.position = mouseGridPos; if (Input.GetMouseButtonDown(0) && debounceTime <= 0 && SelectLocation()) @@ -90,34 +81,14 @@ public class PlayerEntityMovement : MonoBehaviour { selectedEntity = entitySelected; isMoving = true; - debounceTime = debounceDuration; //alotta for loops here + debounceTime = debounceDuration; UncolorGrid(); - currentMovableTiles.Clear(); - paths.Clear(); - foreach (TileObject tileObject in selectedEntity.currentTile.neighbors) - { - if (!tileObject.blocked && !tileObject.hasUnit) - { - currentMovableTiles.Enqueue(tileObject); - paths.Add(tileObject, selectedEntity.currentTile); - tileObject.sprite.color = Color.green; - } - } - for (int i = 0; i < selectedEntity.maxMovement - 1; i++) - { - foreach (TileObject tileObject in currentMovableTiles.ToArray()) - { - foreach (TileObject neighboringTiles in tileObject.neighbors) - { - if (!neighboringTiles.blocked && !neighboringTiles.hasUnit) - { - currentMovableTiles.Enqueue(neighboringTiles); - neighboringTiles.sprite.color = Color.green; - paths.TryAdd(neighboringTiles, tileObject); - } - } - } - } + frontier.Clear(); + visited.Clear(); + currentPaths.Clear(); + pathRequested.Clear(); + GetAllTiles(); + GetTilesInRange(); CreateTemplate(); } @@ -129,6 +100,66 @@ public class PlayerEntityMovement : MonoBehaviour } } + private void GetAllTiles() + { + frontier.Enqueue(selectedEntity.currentTile); + while (frontier.Count > 0) + { + TileObject currentTile = frontier.Dequeue(); + foreach (TileObject neighboringTiles in currentTile.neighbors) + { + if (!visited.Contains(neighboringTiles)) + { + visited.Add(neighboringTiles); + frontier.Enqueue(neighboringTiles); + currentPaths.TryAdd(neighboringTiles, currentTile); + } + } + } + } + + private void PathfindToTarget() + { + pathRequested.Clear(); + TileObject currentTile = requestedTile; + while (currentTile != selectedEntity.currentTile) + { + pathRequested.Add(currentTile); + currentTile = currentPaths[currentTile]; + } + pathRequested.Reverse(); + foreach (TileObject tile in pathRequested) + { + tile.sprite.color = Color.blue; + } + } + + private void GetTilesInRange() + { + foreach (TileObject neighboringTiles in selectedEntity.currentTile.neighbors) + { + if (!neighboringTiles.blocked && !neighboringTiles.hasUnit) + { + currentMovableTiles.Add(neighboringTiles); + neighboringTiles.sprite.color = Color.green; + } + } + for (int i = 0; i < selectedEntity.maxMovement - 1; i++) + { + foreach (TileObject tileObject in currentMovableTiles.ToArray()) + { + foreach (TileObject neighboringTiles in tileObject.neighbors) + { + if (!neighboringTiles.blocked && !neighboringTiles.hasUnit) + { + currentMovableTiles.Add(neighboringTiles); + neighboringTiles.sprite.color = Color.green; + } + } + } + } + } + private bool SelectLocation() { if (!requestedTile || requestedTile.blocked || requestedTile.hasUnit || !currentMovableTiles.Contains(requestedTile)) @@ -137,13 +168,17 @@ public class PlayerEntityMovement : MonoBehaviour } selectedEntity.currentTile.hasUnit = false; requestedTile.hasUnit = true; - selectedEntity.currentTile = requestedTile; - selectedEntity.transform.position = mouseGridPos; + StartCoroutine(selectedEntity.MoveToLocation(pathRequested.ToArray())); templateObject.SetActive(false); UncolorGrid(); return true; } + private void Deselect() + { + isMoving = false; + } + private void CreateTemplate() { templateObject.SetActive(true);