// 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); }
//@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; } } } }