Beispiel #1
0
        // With the use of the overlap, the other stuff can be rebuild.
        private bool TryGetPathColliderOverlap(PathCollider pathCollider, out Vector3[] overlapExtremes)
        {
            Vector3[] colliderExtremes    = pathCollider.Extremes;
            Vector3[] pathNetworkExtremes = Extremes;

            if (colliderExtremes[1].x <pathNetworkExtremes[0].x || colliderExtremes[0].x> pathNetworkExtremes[1].x ||
                colliderExtremes[1].y <pathNetworkExtremes[0].y && colliderExtremes[0].y> pathNetworkExtremes[1].y ||
                colliderExtremes[1].z <pathNetworkExtremes[0].z || colliderExtremes[0].z> pathNetworkExtremes[1].z)
            {
                overlapExtremes = null;
                return(false);
            }

            overlapExtremes      = new Vector3[2];
            overlapExtremes[0].x = (colliderExtremes[0].x < pathNetworkExtremes[0].x) ? pathNetworkExtremes[0].x : colliderExtremes[0].x;
            overlapExtremes[0].y = (colliderExtremes[0].y < pathNetworkExtremes[0].y) ? pathNetworkExtremes[0].y : colliderExtremes[0].y;
            overlapExtremes[0].z = colliderExtremes[0].z;

            overlapExtremes[1].x = (colliderExtremes[1].x > pathNetworkExtremes[1].x) ? pathNetworkExtremes[1].x : colliderExtremes[1].x;
            overlapExtremes[1].y = (colliderExtremes[1].y > pathNetworkExtremes[1].y) ? pathNetworkExtremes[1].y : colliderExtremes[1].y;
            overlapExtremes[1].z = colliderExtremes[1].z;
            return(true);
        }
    void SpawnBoard()
    {
        Vector3 SpawnLocation = transform.position + (SpawnPosition * Random.Range(MultiplierMin, MultiplierMax)) + new Vector3(Random.Range(-BoardsSpawnAddon.x, BoardsSpawnAddon.x), Random.Range(-BoardsSpawnAddon.y, BoardsSpawnAddon.y), 0);


        GameObject   Board           = Instantiate(Boards[Random.Range(0, Boards.Length)], SpawnLocation, Quaternion.identity, transform);
        GameObject   Pathway         = Instantiate(PathWay, Vector3.zero, Quaternion.identity);
        LineRenderer PathwayLR       = Pathway.GetComponent <LineRenderer>();
        PathCollider PathwayCollider = Pathway.GetComponent <PathCollider>();

        PathwayLR.startWidth = PathWayWidth;
        PathwayLR.endWidth   = PathWayWidth;
        PathwayLR.SetPosition(0, transform.position);
        PathwayLR.SetPosition(1, SpawnLocation);

        PathwayCollider.Value    = CreateBoard.value;
        PathwayCollider.Origin   = transform.localPosition;
        PathwayCollider.EndPoint = SpawnLocation;
        PlayerControl.OnPath.Add(false);
        CreateBoard.value++;
        CreateBoard.BoardsMade++;
        value++;
    }
    private int Partition(int low, int high)
    {
        float pivot = colliders[high].transform.position.x;

        int i = low - 1;

        for (int j = low; j <= high - 1; j++)
        {
            if (colliders[j].transform.position.z < pivot)
            {
                i++;
                PathCollider temp1 = colliders[i];
                colliders[i] = colliders[j];
                colliders[j] = temp1;
            }
        }

        PathCollider temp = colliders[i + 1];

        colliders[i + 1] = colliders[high];
        colliders[high]  = temp;

        return(i + 1);
    }
Beispiel #4
0
        //@TODO: Support region up.
        //@TODO: Support 6 directions.
        public void GenerateNodes(PathAgent pathAgent, Vector3 nodeUp)
        {
            Vector3 rayPosition = Extremes[0];
            Vector3 endPosition = Extremes[1];

            // Other regions do not know of the distribution. Therefore regions should perhaps be scaled to the spacing.
            // Regions that go out of boundaries should still spawn and solve what they can within boundaries.
            for (; rayPosition.x <= endPosition.x; rayPosition.x += _gridSpacing)
            {
                rayPosition.y = Extremes[0].y;
                for (int rowCount = 0; rayPosition.y <= endPosition.y; rayPosition.y += _gridSpacing, rowCount++)
                {
                    Vector3 rayOrigin = rayPosition;

                    // Shoves the entire row by half a spacing to form a diamond pattern.
                    if (rowCount % 2 == 0)
                    {
                        rayOrigin.x += (_gridSpacing / 2);
                    }

                    Collider2D[] colliders = Physics2D.OverlapCircleAll(rayOrigin, pathAgent.Radius);
                    //RaycastHit2D[] colliders = Physics2D.RaycastAll(rayOrigin, Vector3.forward, pathAgent.Height);
                    if (colliders.Length == 0)
                    {
                        continue;
                    }

                    Debug.Log(colliders.Length);

                    int        priorityLayer    = int.MaxValue;
                    Collider2D priorityCollider = null;

                    foreach (var collider in colliders)
                    {
                        rayOrigin.z = collider.transform.position.z;
                        if (!collider.bounds.Contains(rayOrigin))
                        {
                            continue;
                        }

                        int colliderLayer = collider.gameObject.layer;
                        if (colliderLayer == PathNetwork.UnwalkableLayer || colliderLayer == PathNetwork.CustomLayer)
                        {
                            priorityLayer    = colliderLayer;
                            priorityCollider = collider;
                            break;
                        }
                        if (colliderLayer < priorityLayer)
                        {
                            priorityLayer    = colliderLayer;
                            priorityCollider = collider;
                        }
                    }

                    if (priorityCollider == null)
                    {
                        continue;
                    }

                    switch (priorityLayer)
                    {
                    case PathNetwork.CustomLayer:
                        Debug.Log("Custom");
                        colliders = QuickSortByHeight(colliders);
                        int length = colliders.Length - 2;
                        for (int i = 0; i <= length; i++)
                        {
                            PathCollider pathCollider = colliders[i].transform.GetComponent <PathCollider>();
                            if (pathCollider != null)
                            {
                                if (pathCollider.IsStatic)
                                {
                                    continue;
                                }

                                Collider2D collider = colliders[i + 1];
                                priorityLayer = collider.transform.gameObject.layer;
                                if (PathNetwork.UnwalkableLayer == priorityLayer)
                                {
                                    break;
                                }

                                // When you click it, the custom node should still be returned because of the pathCollider's collider.
                                Debug.Log("CHECK");
                                Node node = CreateNode(rayOrigin, collider, collider.transform.gameObject.layer, nodeUp);
                                pathCollider.OverlappedNodes.Add(node);
                                break;
                            }
                        }
                        break;

                    case PathNetwork.UnwalkableLayer:
                        Debug.Log("Break.");
                        break;

                    default:
                        Debug.Log("Normal");
                        CreateNode(rayOrigin, priorityCollider, priorityLayer, nodeUp);
                        break;
                    }
                }
            }
        }