Exemplo n.º 1
0
 public void SetPosition(Vector3 orig, Vector3 target, float lerp, RaySearch ray, bool nextCornerIsRight, Vector3 normal)
 {
     transform.forward  = normal;
     transform.position = Vector3.Lerp(orig, target, lerp);
     search             = ray;
     originPos          = nextCornerIsRight ? orig : target;
     targetPos          = nextCornerIsRight ? target : orig;
     movementMode       = true;
 }
Exemplo n.º 2
0
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (Physics.Raycast(transform.position + (Vector3.up * .1f), transform.forward, out RaycastHit hit, 1))
            {
                if (hit.transform.GetComponentInChildren <RaySearch>() != null)
                {
                    //store raycasted object's RaySearch component
                    RaySearch search = hit.transform.GetComponentInChildren <RaySearch>();

                    //create a new list of all the corner positions
                    List <Vector3> cornerPoints = new List <Vector3>();

                    for (int i = 0; i < search.cornerPoints.Count; i++)
                    {
                        cornerPoints.Add(search.cornerPoints[i].position);
                    }

                    //find the closest corner position and index
                    closestCorner = GetClosestPoint(cornerPoints.ToArray(), hit.point);
                    int index = search.cornerPoints.FindIndex(x => x.position == closestCorner);

                    //determine the adjacent corners
                    nextCorner     = (index < search.cornerPoints.Count - 1) ? search.cornerPoints[index + 1].position : search.cornerPoints[0].position;
                    previousCorner = (index > 0) ? search.cornerPoints[index - 1].position : search.cornerPoints[search.cornerPoints.Count - 1].position;

                    //choose a corner to be the target
                    chosenCorner = Vector3.Dot((closestCorner - hit.point), (nextCorner - hit.point)) > 0 ? previousCorner : nextCorner;
                    bool nextCornerIsRight = isRightSide(-hit.normal, chosenCorner - closestCorner, Vector3.up);

                    //find the distance from the origin point
                    float distance  = Vector3.Distance(closestCorner, chosenCorner);
                    float playerDis = Vector3.Distance(chosenCorner, hit.point);

                    //quick fix so that we don't allow the player to start in a corner;
                    if (playerDis > (distance - decalMovement.distanceToTurn))
                    {
                        playerDis = distance - decalMovement.distanceToTurn;
                    }
                    if (playerDis < decalMovement.distanceToTurn)
                    {
                        playerDis = decalMovement.distanceToTurn;
                    }

                    //find it's normalized position in the distance of the origin and target
                    float positionLerp = Mathf.Abs(distance - playerDis) / ((distance + playerDis) / 2);

                    //start the MovementScript
                    decalMovement.SetPosition(closestCorner, chosenCorner, positionLerp, search, nextCornerIsRight, hit.normal);

                    //transition logic
                    Transition(true, Vector3.Lerp(closestCorner, chosenCorner, positionLerp), hit.normal);
                }
            }
        }
    }