public void Scan(List <GameObject> pointsList, Queue <GameObject> toVisit, GameObject parentMapObject) { /// <summary> /// when instantiated, perform raycasts to forward, left, right, and back /// if raycast hits spatial map point is set to null /// if raycast hits another gridpoint set respective property to that object and tell that object to do the same /// else instantiate a new gridpoint and add it to pointList /// </summary> RaycastHit hitInfo; // raycast forward if (Physics.Raycast(transform.position, Vector3.forward, out hitInfo, segmentDistance, layerMask, QueryTriggerInteraction.Collide)) { if (hitInfo.collider.gameObject.CompareTag("GridPoint")) { SetForwardPoint(hitInfo.collider.gameObject); forwardGridPoint.SetBackPoint(gameObject); } else { SetForwardPoint(null); } } else { Vector3 newPosition = transform.position + (Vector3.forward * segmentDistance); GameObject newGridPoint = Instantiate(gridPoint, newPosition, Quaternion.identity) as GameObject; newGridPoint.transform.parent = parentMapObject.transform; GridPoint gp = newGridPoint.GetComponent <GridPoint>(); if (gp.isValid() && gp.CheckBounds()) { pointsList.Add(newGridPoint); toVisit.Enqueue(newGridPoint); SetForwardPoint(newGridPoint); } else { SetForwardPoint(null); Destroy(newGridPoint); } } // raycast right if (Physics.Raycast(transform.position, Vector3.right, out hitInfo, segmentDistance, layerMask, QueryTriggerInteraction.Collide)) { if (hitInfo.collider.gameObject.CompareTag("GridPoint")) { SetRightPoint(hitInfo.collider.gameObject); rightGridPoint.SetLeftPoint(gameObject); } else { SetRightPoint(null); } } else { Vector3 newPosition = transform.position + (Vector3.right * segmentDistance); GameObject newGridPoint = Instantiate(gridPoint, newPosition, Quaternion.identity) as GameObject; newGridPoint.transform.parent = parentMapObject.transform; GridPoint gp = newGridPoint.GetComponent <GridPoint>(); if (gp.isValid() && gp.CheckBounds()) { pointsList.Add(newGridPoint); toVisit.Enqueue(newGridPoint); SetRightPoint(newGridPoint); } else { SetRightPoint(null); Destroy(newGridPoint); } } // raycast left if (Physics.Raycast(transform.position, Vector3.left, out hitInfo, segmentDistance, layerMask, QueryTriggerInteraction.Collide)) { if (hitInfo.collider.gameObject.CompareTag("GridPoint")) { SetLeftPoint(hitInfo.collider.gameObject); leftGridPoint.SetRightPoint(gameObject); } else { SetLeftPoint(null); } } else { Vector3 newPosition = transform.position + (Vector3.left * segmentDistance); GameObject newGridPoint = Instantiate(gridPoint, newPosition, Quaternion.identity) as GameObject; newGridPoint.transform.parent = parentMapObject.transform; GridPoint gp = newGridPoint.GetComponent <GridPoint>(); if (gp.isValid() && gp.CheckBounds()) { pointsList.Add(newGridPoint); toVisit.Enqueue(newGridPoint); SetLeftPoint(newGridPoint); } else { SetLeftPoint(null); Destroy(newGridPoint); } } // raycast back if (Physics.Raycast(transform.position, Vector3.back, out hitInfo, segmentDistance, layerMask, QueryTriggerInteraction.Collide)) { if (hitInfo.collider.gameObject.CompareTag("GridPoint")) { SetBackPoint(hitInfo.collider.gameObject); backGridPoint.SetForwardPoint(gameObject); } else { SetBackPoint(null); } } else { Vector3 newPosition = transform.position + (Vector3.back * segmentDistance); GameObject newGridPoint = Instantiate(gridPoint, newPosition, Quaternion.identity) as GameObject; newGridPoint.transform.parent = parentMapObject.transform; GridPoint gp = newGridPoint.GetComponent <GridPoint>(); if (gp.isValid() && gp.CheckBounds()) { pointsList.Add(newGridPoint); toVisit.Enqueue(newGridPoint); SetBackPoint(newGridPoint); } else { SetBackPoint(null); Destroy(newGridPoint); } } //gameObject.GetComponentInChildren<MeshRenderer>().material = scannedMaterial; }