public void UpdateDiffusionValues()
    {
        //cria cópia
        DiffTile[,] old_matrix = new DiffTile[NX, NZ];
        Array.Copy(matrix, old_matrix, matrix.Length);

        for (int i = 0; i < NX; i++)
        {
            for (int j = 0; j < NZ; j++)
            {
                if (matrix[i, j].ignore)
                //é uma parede ou coisa assim, ignora
                {
                }
                else if (i == playerPosX && j == playerPosZ)
                //o player está aqui
                {
                    //decaimento pela exponecial
                    matrix[i, j].value = ValueAtObjective;                   // * Mathf.Exp(decayFactor * (lastTimeSeen - Time.frameCount));
                }
                else if (agentPositions.ContainsValue(new Vector2Int(i, j)))
                // senão, tentamos ver no dicionario se ha um agente nessa posição
                {
                    matrix[i, j].value = -ValueAtObjective;
                }
                else
                {
                    //fórmula da difusão
                    float sum = 0.0f;
                    //tenta pegar os valores de:
                    //cima
                    if (j - 1 >= 0)
                    {
                        sum += matrix[i, j - 1].value - matrix[i, j].value;
                    }
                    //baixo
                    if (j + 1 < NZ)
                    {
                        sum += matrix[i, j + 1].value - matrix[i, j].value;
                    }
                    //direita
                    if (i + 1 < NX)
                    {
                        sum += matrix[i + 1, j].value - matrix[i, j].value;
                    }
                    //esquerda
                    if (i - 1 >= 0)
                    {
                        sum += matrix[i - 1, j].value - matrix[i, j].value;
                    }

                    matrix[i, j].value = matrix[i, j].value + DiffCoefficient * sum / 4.0f;
                }
            }
        }
    }
    public void SetMatrixPositions()
    {
        coll = GetComponent <BoxCollider>();
        dx   = coll.bounds.size.x / NX;
        dz   = coll.bounds.size.z / NZ;

        matrix = new DiffTile[NX, NZ];

        var min = coll.transform.TransformPoint(coll.center - coll.size * 0.5f) - transform.position;
        var max = coll.transform.TransformPoint(coll.center + coll.size * 0.5f) - transform.position;

        x0 = (float)(transform.position.x + min.x + dx / 2.0);
        z0 = (float)(transform.position.z + min.z + dz / 2.0);


        //inicializa matriz com os valores da difusão
        for (int i = 0; i < NX; i++)
        {
            for (int j = 0; j < NZ; j++)
            {
                Vector3  position = new Vector3(x0 + i * dx, coll.center.y, z0 + j * dz);
                DiffTile tile     = new DiffTile();

                //se tem uma parede em cima desse tile, ele deve ser excluído do cálculo da difusão
                if (Physics.Raycast(position, Vector3.up, 100f, LayerMask.GetMask("Obstacle")))
                {
                    tile.ignore = true;
                }
                else
                {
                    tile.ignore = false;
                }

                tile.value   = 0.0f;
                matrix[i, j] = tile;
                Debug.Log(matrix[i, j]);
            }
        }

        Debug.Log("Matrix set succesfully");
    }