Beispiel #1
0
    ////---CHECAGENS DE COLISAO---////
    void ChecaProfundidade()
    {
        estados.direcaoDaParede = 0;
        if (rotacionaCamera.Rotacionando())
        {
            return;
        }

        if (AtrasDeAlgo())
        {
//			if(log)
//				Debug.Log("Atras de algum objeto");
            return;
        }

        Debug.DrawLine(trBaseM.position - (trBaseM.forward * profundidadeDeChecagem) + vetorIntensidadeVertical,
                       trBaseM.position + (trBaseM.forward * profundidadeDeChecagem) + vetorIntensidadeVertical,
                       Color.green, 0.01f);
        Debug.DrawLine(trMeio.position - trMeio.forward * profundidadeDeChecagem,
                       trMeio.position + trMeio.forward * profundidadeDeChecagem,
                       Color.green, 0.01f);
        Debug.DrawLine(trTopoM.position - trTopoM.forward * profundidadeDeChecagem,
                       trTopoM.position + trTopoM.forward * profundidadeDeChecagem,
                       Color.green, 0.01f);

        if (EstaCaindo() &&
            (HaPlataformaEmProfundidade(trBaseM.position + vetorIntensidadeVertical) ||
             HaPlataformaEmProfundidade(trBaseD.position + vetorIntensidadeVertical) ||
             HaPlataformaEmProfundidade(trBaseE.position + vetorIntensidadeVertical)))
        {
            Transform trColisor      = colisaoEmProfundidade.transform;
            Vector3   pontoDeColisao = colisaoEmProfundidade.point;
            if (log)
            {
                Debug.Log("Base colidiu com " + trColisor.name, trColisor);
            }

//			if(RetornaPontoMaisProximo(pontoDeColisao, tr.position).Equals(pontoDeColisao))
            {
//				novaPos = pontoDeColisao + tr.forward * 0.5f;
//				AtualizaProfundidade(colisaoEmProfundidade.transform);
//			}else
//			{
                novaPos = pontoDeColisao + tr.forward * 0.5f;
                AtualizaProfundidade(trColisor);
                estados.HabilitaPulo();
            }
        }

        if (ColidiuComAlgoNaDireita() || ColidiuComAlgoNaEsquerda())
        {
            Transform trObjeto = colisaoEmProfundidade.transform;
//			Debug.Log(rb.velocity.x);
            if (trObjeto.CompareTag("Parede"))
            {
                estados.direcaoDaParede = RetornaLadoEmRelacaoAoPlayer(trObjeto.position);
                if (estados.noAr)
                {
                    novaPos = colisaoEmProfundidade.point + tr.forward * 0.5f;
                    AtualizaProfundidade(trObjeto);

                    if (estados.ApertandoParaOsLados() || movimento.contTempoPraPularDaParede <= movimento.tempoMaximoAtePuloRapido)
                    {
                        estados.AtivaEstaNaParede();
                    }

                    estados.Para();
                    return;
                }
                else
                {
                    if (ApertandoParaOLadoDaParede())
                    {
                        estados.Para();
                        return;
                    }
                }
            }
            else
            {
                estados.DesabilitaEstaNaParede();
            }
        }

        if (CabecaBateuEmAlgo())
        {
            Transform trColisor      = colisaoEmProfundidade.transform;
            Vector3   pontoDeColisao = colisaoEmProfundidade.point;

            if (RetornaPontoMaisProximo(pontoDeColisao, tr.position).Equals(pontoDeColisao))
            {
                if (log)
                {
                    Debug.Log("Topo colidiu com " + colisaoEmProfundidade.collider.name, colisaoEmProfundidade.transform);
                }
                novaPos = pontoDeColisao - tr.forward;
                if (!ColisaoOcorreuComObjetoAoFundo())
                {
                    AtualizaProfundidade(trColisor);
                }
            }
        }

        if (estados.naParede)
        {
            return;
        }

        if (estados.GetDirecao() == Definicoes.DIREITA)        //movendo para a direita
        {
            Debug.DrawLine(trCentroD.position - trCentroD.forward * profundidadeDeChecagem,
                           trCentroD.position + trCentroD.forward * profundidadeDeChecagem,
                           Color.blue, 0.01f);
            if (ColidiuComAlgoNaDireita())
            {
                Transform trObjetoDireita = colisaoEmProfundidade.transform;

                if (!ColisaoOcorreuComObjetoAoFundo())
                {
                    if (log)
                    {
                        Debug.Log("Colisao nao ocorreu ao fundo ", trObjetoDireita);
                    }
                    if (ColidiuComAlgoNaEsquerda())
                    {
                        if (!trObjetoDireita.Equals(colisaoEmProfundidade.transform))
                        {
                            if (log)
                            {
                                Debug.Log("Bloqueio a frente ", trObjetoDireita);
                            }
                            Vector3 colisorMaisProximoDaCamera = RetornaPontoMaisProximo(trObjetoDireita.position, colisaoEmProfundidade.transform.position);
                            novaPos = colisorMaisProximoDaCamera - tr.forward * 1.5f;
                            if (colisorMaisProximoDaCamera == trObjetoDireita.position)
                            {
                                AtualizaProfundidade(trObjetoDireita);
                                if (trObjetoDireita.CompareTag("Parede"))
                                {
                                    estados.AtivaEstaNaParede();
                                    return;
                                }
                            }
                            else
                            {
                                AtualizaProfundidade(colisaoEmProfundidade.transform);
                                if (colisaoEmProfundidade.transform.CompareTag("Parede"))
                                {
                                    estados.AtivaEstaNaParede();
                                    return;
                                }
                            }
                            estados.Para();
                        }
                        else
                        {
                            estados.Move();
                        }
                    }
                    else
                    {
                        if (log)
                        {
                            Debug.Log("Bloqueio a direita ", trObjetoDireita);
                        }
                        if (HaChaoNoPonto(colisaoEmProfundidade.point))
                        {
                            novaPos = trObjetoDireita.position - tr.forward * 1.5f;
                            AtualizaProfundidade(trObjetoDireita);
                            estados.Move();
                            movimento.DefineNovoEixo();
                        }
                        else
                        {
                            estados.Para();
                            movimento.ZeraEixo(Vector3.right);
                            rb.velocity = new Vector3(0, rb.velocity.y, rb.velocity.z);
                        }
                    }
                }
                else
                {
                    estados.Move();
                }
            }
            else
            {
                estados.Move();
                estados.DesabilitaEstaNaParede();
                movimento.DefineNovoEixo();
            }
        }
        else if (estados.GetDirecao() == Definicoes.ESQUERDA)         //movendo para a esquerda
        {
            Debug.DrawLine(trCentroE.position - trCentroE.forward * profundidadeDeChecagem,
                           trCentroE.position + trCentroE.forward * profundidadeDeChecagem,
                           Color.blue, 0.01f);
            if (ColidiuComAlgoNaEsquerda())
            {
                Transform trObjetoEsquerda = colisaoEmProfundidade.transform;
                if (!ColisaoOcorreuComObjetoAoFundo())
                {
                    if (log)
                    {
                        Debug.Log("Colisao nao ocorreu ao fundo ", trObjetoEsquerda);
                    }
                    if (ColidiuComAlgoNaDireita())
                    {
                        if (!trObjetoEsquerda.Equals(colisaoEmProfundidade.transform))
                        {
                            if (log)
                            {
                                Debug.Log("Bloqueio a frente ", trObjetoEsquerda);
                            }
                            Vector3 colisorMaisProximoDaCamera = RetornaPontoMaisProximo(trObjetoEsquerda.position, colisaoEmProfundidade.transform.position);
                            novaPos = colisorMaisProximoDaCamera - tr.forward * 1.5f;
                            if (colisorMaisProximoDaCamera == trObjetoEsquerda.position)
                            {
                                AtualizaProfundidade(trObjetoEsquerda);
                                if (trObjetoEsquerda.CompareTag("Parede"))
                                {
                                    estados.AtivaEstaNaParede();
                                    return;
                                }
                            }
                            else
                            {
                                AtualizaProfundidade(colisaoEmProfundidade.transform);
                                if (colisaoEmProfundidade.transform.CompareTag("Parede"))
                                {
                                    estados.AtivaEstaNaParede();
                                    return;
                                }
                            }
                            estados.Para();
                        }
                        else
                        {
                            estados.Move();
                        }
                    }
                    else
                    {
                        if (log)
                        {
                            Debug.Log("Bloqueio a esquerda ", trObjetoEsquerda);
                        }
                        if (HaChaoNoPonto(colisaoEmProfundidade.point))
                        {
                            novaPos = trObjetoEsquerda.position - tr.forward * 1.5f;
                            AtualizaProfundidade(trObjetoEsquerda);
                            estados.Move();
                            movimento.DefineNovoEixo();
                        }
                        else
                        {
                            estados.Para();
                            movimento.ZeraEixo(Vector3.right);
                            rb.velocity = new Vector3(0, rb.velocity.y, rb.velocity.z);
                        }
                    }
                }
                else
                {
                    estados.Move();
                }
            }
            else
            {
                estados.Move();
                estados.DesabilitaEstaNaParede();
                movimento.DefineNovoEixo();
            }
        }
    }