Ejemplo n.º 1
0
 private void Update()
 {
     if (Input.GetMouseButtonDown(0))
     {
         var        ray = hitCamera.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
         if (baseCollider.Raycast(ray, out hit, 20))
         {
             NavigationBuildPoint point = points[graph.FindNearestId(hit.point)];
             startObject.position = hit.point;
             startPoint           = point;
             TryFindPath();
         }
     }
     if (Input.GetMouseButtonDown(1))
     {
         var        ray = hitCamera.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
         if (baseCollider.Raycast(ray, out hit, 20))
         {
             NavigationBuildPoint point = points[graph.FindNearestId(hit.point)];
             endObject.position = hit.point;
             endPoint           = point;
             TryFindPath();
         }
     }
 }
Ejemplo n.º 2
0
 private void MergePoints(NavigationBuildPoint point, NavigationBuildPoint merge)
 {
     foreach (var neigbhor in merge.Neigbhors)
     {
         if (neigbhor.Neigbhors == null)
         {
             continue;
         }
         for (int i = 0; i < neigbhor.Neigbhors.Count; i++)
         {
             if (neigbhor.Neigbhors[i] == merge)
             {
                 neigbhor.Neigbhors[i] = point;
             }
         }
     }
     point.Neigbhors.AddRange(merge.Neigbhors);
     merge.Neigbhors = null;
 }
Ejemplo n.º 3
0
    private NavigationBuildPoint[] GenerateNavGrid(float radius)
    {
        var directions = new Quaternion[] {
            Quaternion.Euler(0, 0, 0),
            Quaternion.Euler(0, 90, 0),
            Quaternion.Euler(0, 180, 0),
            Quaternion.Euler(0, 270, 0),
            Quaternion.Euler(90, 0, 0),
            Quaternion.Euler(-90, 0, 0),
        };
        List <NavigationBuildPoint> points      = new List <NavigationBuildPoint>();
        List <NavigationBuildPoint> borderPoins = new List <NavigationBuildPoint>();

        NavigationBuildPoint[] grid = new NavigationBuildPoint[size * size];
        for (int d = 0; d < directions.Length; d++)
        {
            var direction = directions[d];
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    Vector3 cellPosition  = direction * new Vector3(-0.5f + 1f * (i / (float)(size - 1)), -0.5f + 1f * (j / (float)(size - 1)), 0.5f);
                    Vector3 normal        = cellPosition.normalized;
                    Vector3 cell          = (cellPosition + Vector3.one) * size;
                    bool    isBorderPoint = (i == 0 || j == 0 || i == size - 1 || j == size - 1);
                    var     point         = new NavigationBuildPoint()
                    {
                        Position      = normal * radius,
                        UpNormal      = normal,
                        IsBorderPoint = isBorderPoint,
                        PositionHash  = (int)(cell.x * (size + 1)) * (size + 1) + (int)(cell.y * (size + 1)) + (int)cell.z
                    };
                    if (isBorderPoint)
                    {
                        borderPoins.Add(point);
                    }
                    points.Add(point);
                    grid[i * size + j] = point;
                }
            }
            // add links
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    for (int dx = -2; dx <= 2; dx++)
                    {
                        for (int dy = -2; dy <= 2; dy++)
                        {
                            if (dx == 0 && dy == 0)
                            {
                            }
                            else
                            {
                                AddLinks(ref grid, ref grid[i * size + j].Neigbhors, i + dx, j + dy);
                            }
                        }
                    }
                }
            }
        }
        // merge borders
        foreach (var point in borderPoins)
        {
            if (point.Neigbhors == null)
            {
                continue;
            }
            foreach (var merge in borderPoins)
            {
                if (merge == point)
                {
                    continue;
                }
                if (merge.Neigbhors == null)
                {
                    continue;
                }
                if (merge.PositionHash == point.PositionHash)
                {
                    MergePoints(point, merge);
                    break;
                }
            }
        }
        points.RemoveAll(point => point.Neigbhors == null);
        foreach (var point in points)
        {
            point.Distances = new List <float>(point.Neigbhors.Count);
            for (int i = 0; i < point.Neigbhors.Count; i++)
            {
                var distance = Vector3.Distance(point.Position, point.Neigbhors[i].Position);
                point.Distances.Add(distance);
            }
        }
        return(points.ToArray());
    }
Ejemplo n.º 4
0
    private List <NavigationBuildPoint> GenerateNavGridIcosaedron(float radius)
    {
        List <NavigationBuildPoint> points      = new List <NavigationBuildPoint>();
        List <NavigationBuildPoint> borderPoins = new List <NavigationBuildPoint>();

        NavigationBuildPoint[] grid = new NavigationBuildPoint[size * size];
        for (int d = 0; d < icosaedronFaces.Length / 3; d++)
        {
            var A  = icosaedronVertices[icosaedronFaces[d * 3 + 0]];
            var B  = icosaedronVertices[icosaedronFaces[d * 3 + 1]];
            var C  = icosaedronVertices[icosaedronFaces[d * 3 + 2]];
            var BA = B - A;
            var CA = C - A;
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    if (i + j >= size)
                    {
                        continue;
                    }
                    Vector3 cellPosition  = A + BA * (i / (float)(size - 1)) + CA * (j / (float)(size - 1));
                    Vector3 normal        = cellPosition.normalized;
                    Vector3 cell          = (normal + Vector3.one) * size * 10f;
                    bool    isBorderPoint = (i == 0 || j == 0 || i + j == size - 1);
                    var     point         = new NavigationBuildPoint()
                    {
                        Position      = normal * radius,
                        UpNormal      = normal,
                        IsBorderPoint = isBorderPoint,
                        PositionHash  = (int)(cell.x * (size + 1f) * (size + 1f)) + (int)(cell.y * (size + 1f)) + (int)(cell.z)
                    };
                    if (isBorderPoint)
                    {
                        borderPoins.Add(point);
                    }
                    points.Add(point);
                    grid[i * size + j] = point;
                }
            }
            // add links
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    if (i + j >= size)
                    {
                        continue;
                    }
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 1, j);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 1, j);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i, j + 1);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i, j - 1);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 1, j + 1);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 1, j - 1);

                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 1, j + 1);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 1, j - 1);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 1, j + 2);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i - 2, j + 1);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 2, j - 1);
                    AddLinksHex(ref grid, ref grid[i * size + j].Neigbhors, i + 1, j - 2);
                }
            }
        }
        // merge borders
        foreach (var point in borderPoins)
        {
            if (point.Neigbhors == null)
            {
                continue;
            }
            foreach (var merge in borderPoins)
            {
                if (merge == point)
                {
                    continue;
                }
                if (merge.Neigbhors == null)
                {
                    continue;
                }
                if (merge.PositionHash == point.PositionHash)
                {
                    MergePoints(point, merge);
                    break;
                }
            }
        }
        points.RemoveAll(point => point.Neigbhors == null);
        foreach (var point in points)
        {
            point.Distances = new List <float>(point.Neigbhors.Count);
            for (int i = 0; i < point.Neigbhors.Count; i++)
            {
                var distance = Vector3.Distance(point.Position, point.Neigbhors[i].Position);
                point.Distances.Add(distance);
            }
        }
        return(points);
    }