protected IEnumerator GoToWaypoint(GameObject waypointGO) { RisovalkaWaypoint waypoint = waypointGO.GetComponent <RisovalkaWaypoint>(); currentSpeed += waypoint.speedIncrement; currentTurnSpeed += waypoint.turnSpeedIncrement; currentRotation = 0; if (waypoint.teleport) { transform.position = waypointGO.transform.position; transform.rotation = waypoint.targetRotation; transform.localScale = waypoint.targetScale; ApplyChanges(waypoint); yield break; } else { while (MovingToWaypoint(waypoint)) { CalculateMovement(waypoint); yield return(new WaitForEndOfFrame()); } ApplyChanges(waypoint); } yield break; }
protected override void CalculateMovement(RisovalkaWaypoint waypoint) { Vector3 relativeTarget = transform.InverseTransformPoint(waypoint.transform.position); //get relative target position float targetAngle = Mathf.Atan2(relativeTarget.y, relativeTarget.x); //get desired angle targetAngle *= Mathf.Rad2Deg; // convert to degrees targetAngle -= forwardRotation; if (targetAngle != transform.rotation.z) //only turn when needed { float turningThisFrame; if (Mathf.Abs(targetAngle - transform.rotation.z) > currentTurnSpeed * Time.deltaTime) { turningThisFrame = Mathf.Sign(targetAngle - transform.rotation.z) * currentTurnSpeed * Time.deltaTime; } else { turningThisFrame = targetAngle - transform.rotation.z; } transform.Rotate(0, 0, turningThisFrame); } Vector3 movementThisFrame = new Vector3(currentSpeed * Time.deltaTime, 0, 0); Quaternion rotateMovementVector = transform.rotation; rotateMovementVector *= Quaternion.Euler(0, 0, forwardRotation); movementThisFrame = rotateMovementVector * movementThisFrame; transform.position += movementThisFrame; }
protected override bool MovingToWaypoint(RisovalkaWaypoint waypoint) { if (Mathf.Abs(transform.position.x - waypoint.transform.position.x) < distanceToWaypoint && Mathf.Abs(transform.position.y - waypoint.transform.position.y) < distanceToWaypoint) { return(false); } else { return(true); } }
protected override void CalculateMovement(RisovalkaWaypoint waypoint) { transform.position = Vector3.MoveTowards(transform.position, waypoint.transform.position, currentSpeed * Time.deltaTime); if (transform.rotation != waypoint.targetRotation) { transform.rotation = Quaternion.RotateTowards(transform.rotation, waypoint.targetRotation, currentSpeed / 5 * Time.deltaTime); } if (transform.localScale != waypoint.targetScale) { transform.localScale = Vector3.MoveTowards(transform.localScale, waypoint.targetScale, currentSpeed / 30 * Time.deltaTime); } }
protected void ApplyChanges(RisovalkaWaypoint waypoint) { if (waypoint.move != 0) { FindObjectOfType <RisovalkaController>().MoveBackgroundSprites(waypoint.move); } if (waypoint.dropPrize) { prize = Instantiate(prize); prize.transform.position = waypoint.transform.position; FindObjectOfType <RisovalkaController>().OpenBox(); } if (GetNextWaypoint(waypoint.gameObject) != null) { GoToNextWaypoint(GetNextWaypoint(waypoint.gameObject)); } else { DisableThis(); } }
protected override bool MovingToWaypoint(RisovalkaWaypoint waypoint) { return(transform.position != waypoint.transform.position); }
protected virtual void CalculateMovement(RisovalkaWaypoint waypoint) { }