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