Example #1
0
    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;
    }