public void followPath(List <int> path, WARGrid grid) { // make sure the source isn't highlighted grid.GetCell(path[0]).highlighted.Value = false; // if we are in the middle of walking a path if (pathRoutine != null) { // stop the previous routine StopCoroutine(pathRoutine); } // start walking the path pathRoutine = walkPath(path, grid); StartCoroutine(pathRoutine); }
private IEnumerator walkPath(List <int> path, WARGrid grid) { // the last cell we saw var lastCell = path[0]; foreach (var cell in path.Skip(1)) { // the source and target cells var source = grid.GetCell(lastCell); var target = grid.GetCell(cell); gameObject.transform.LookAt(target.transform.position); // move between this cell and the next yield return(moveBetweenCells(source, target, grid)); // make sure we move between this cell next time lastCell = cell; } // we're done with our coroutine pathRoutine = null; }
// coroutine to move object between cells private IEnumerator moveBetweenCells(WARActorCell source, WARActorCell target, WARGrid grid) { // the moment in time along the path between the two cells var i = 0.0f; // the amount to move per tick var rate = 1.0f / speed; // if the cell and the target are the same then we're done if (source == target) { yield break; } // make sure the current cell highlighted lastCell = grid.GetCell(grid.findCellsUnderObject(this)[0]); lastCell.highlighted.Value = true; // until we reach the end while (i < 1.0) { // increment the distance counter to the next tick i += Time.deltaTime * rate; // raycast to find the cell under us var currentCell = grid.GetCell(grid.findCellsUnderObject(this)[0]); // if the cell is different from the last one we saw if (lastCell.id != currentCell.id) { // unhighlight the last cell lastCell.highlighted.Value = false; // and highlilght the one we are under currentCell.highlighted.Value = true; // add ourself to the new cell grid.addObjectsToCell(currentCell.id, new List <WARGridObject> { this }); // remove ourself from the old cell grid.removeObjectsFromCell(lastCell.id, new List <WARGridObject> { this }); // update the cell tracker lastCell = currentCell; } // update our position to the appropriate part of the lerp gameObject.transform.position = Vector3.Lerp( source.transform.position, target.transform.position, i ); // we're done for this tick yield return(null); } }