Exemplo n.º 1
0
    private void NextStep(int count = 0)
    {
        stepCount++;
        nextStepTimer = nextStepCooldown;

        if (goalTile == null || startTile == null)
        {
            doAutoStepThrough = false;
            return;
        }

        if (pathfinder == null)
        {
            pathfinder = new Pathfinder(tilegraph.Nodes[startTile], tilegraph.Nodes[goalTile]);
            tilePath   = null;
            stepCount  = 0;
        }

        pathfinder.ExecutePathfindingStep();
        if (pathfinder.HasFoundPath)
        {
            tilePath = pathfinder.Path;
        }

        foreach (Node <Tile> node in tilegraph.Nodes.Values)
        {
            GameObject     tileGameObject = tileGameObjects[node.Data];
            TileInstance   tileInstance   = tileGameObject.GetComponent <TileInstance>();
            SpriteRenderer spriteRenderer = tileGameObject.GetComponent <SpriteRenderer>();

            if (tilePath != null)
            {
                if (tilePath.Contains(node.Data))
                {
                    tileInstance.Node = null;
                    if (node.Data == startTile || node.Data == goalTile)
                    {
                        continue;
                    }

                    spriteRenderer.color = Color.blue;
                }
                else
                {
                    ResetTileVisuals(node, tileInstance, spriteRenderer);
                }
            }
            else
            {
                if (pathfinder.IsInOpenSet(node))
                {
                    SetTileVisuals(node, tileInstance, spriteRenderer, OpenSetTileColour);
                }
                else if (pathfinder.IsInClosedSet(node))
                {
                    SetTileVisuals(node, tileInstance, spriteRenderer, ClosedSetTileColour);
                }
                else
                {
                    ResetTileVisuals(node, tileInstance, spriteRenderer);
                }
            }
        }

        if (!pathfinder.HasFoundPath && !pathfinder.SearchIsComplete)
        {
            if (doAutoStepThrough && count > 0)
            {
                NextStep(--count);
            }

            return;
        }

        pathfinder        = null;
        doAutoStepThrough = false;

        Debug.Log($"Found path in {stepCount} steps");
    }