コード例 #1
0
    public override void Mover(Vector2Int posFinal, MapaSala mapa)
    {
        if (_percurso == null || _percurso.Count == 0 || _posfinal != posFinal)
        {
            _percurso = new Queue <Node>(FindObjectOfType <Pathfinding>().MenorCaminho(CurrentNode.PosMatrix, posFinal, mapa));

            _posfinal = posFinal;
        }

        float distancia = Vector3.Distance(_transform.position, _currentPosition.PosWorld);

        if (distancia > 0.1f)
        {
            Vector3 direcao = _currentPosition.PosWorld - transform.position;

            direcao = direcao.normalized;

            direcao.z = 0;

            _transform.position += direcao * Time.deltaTime * 2;
        }
        else if (_percurso.Count > 0)
        {
            _currentPosition = _percurso.Dequeue();

            if (_percurso.Count == 0)
            {
                foreach (Node node in mapa.Mapa.Values)
                {
                    node.transform.GetComponent <SpriteRenderer>().color = Color.white;
                }
            }
        }
    }
コード例 #2
0
ファイル: SearchState.cs プロジェクト: ValdeirLevelUP/GJ2021
    public override IEnumerator Enter()
    {
        Debug.Log("Aonde está você?");

        yield return(new WaitForSeconds(1));

        MapaSala[] todosMapas = GameObject.FindObjectOfType <GameManager>().Mapas;

        foreach (MapaSala mapa in todosMapas)
        {
            if (mapa.Regiao == _stateMachine.Enemy._regiaoAtual)
            {
                _mapa = mapa;
                _alvo = mapa.GetRandomNode();
            }
        }
        base.Enter();
    }
コード例 #3
0
ファイル: ChaseState.cs プロジェクト: ValdeirLevelUP/GJ2021
    public override IEnumerator Enter()
    {
        yield return(new WaitForSeconds(0.1f));

        MapaSala[] todosMapas = GameObject.FindObjectOfType <GameManager>().Mapas;

        foreach (MapaSala mapa in todosMapas)
        {
            if (mapa.Regiao == _stateMachine.Enemy._regiaoAtual)
            {
                _mapa = mapa;
                _alvo = GameObject.FindObjectOfType <GameManager>().Personagem.CurrentPosition;
                break;
            }
        }

        base.Enter();
    }
コード例 #4
0
ファイル: Pathfinding.cs プロジェクト: ValdeirLevelUP/GJ2021
    public Node[] MenorCaminho(Vector2Int inicio, Vector2Int fim, MapaSala mapa)
    {
        _percuso = mapa.Mapa;

        Node inicioNode = _percuso[inicio];

        Node fimNode = _percuso[fim];

        LimparNodes();

        DistanciaHeuristica(fimNode);

        inicioNode.G = 0;

        List <Node> listaAberta = new List <Node>();

        HashSet <Node> listaFechada = new HashSet <Node>();

        listaAberta.Add(inicioNode);

        while (listaAberta.Count > 0)
        {
            Node currentNode = BuscarMenorF(listaAberta);

            listaAberta.Remove(currentNode);

            listaFechada.Add(currentNode);

            if (currentNode.PosMatrix == fimNode.PosMatrix)
            {
                Node[] resultado = new Node[listaFechada.Count];
                listaFechada.CopyTo(resultado);
                List <Node> caminhoFinal = new List <Node>();
                Node        node         = currentNode;
                caminhoFinal.Add(currentNode);
                while (node.Anterior != null)
                {
                    caminhoFinal.Add(node.Anterior);
                    node = node.Anterior;
                }
                caminhoFinal.Reverse();
                return(caminhoFinal.ToArray());
            }
            foreach (Node item in BuscarAdjacentes(currentNode))
            {
                if (listaFechada.Contains(item))
                {
                    continue;
                }

                float novoG = DistanciaEntreDoisNode(currentNode, item);

                if (novoG < item.G)
                {
                    item.G = novoG + currentNode.G;

                    item.Anterior = currentNode;

                    if (!listaAberta.Contains(item))
                    {
                        listaAberta.Add(item);
                    }
                }
            }
        }
        return(null);
    }