- Home /
Rotate around object then leave at realistic angle
Hi, I'm trying to make a sphere being able to enter and leave an orbit of another object. Currently I am using transform.RotateAround to make the sphere rotate around the object. However, when I stop the rotation, I want to make the sphere leave the orbit in a streight line that would be realistic.
My problem is that I cant figure what method would make this possible. At the moment I'm using Rigidbody2D.AddForce to a straight "up" force. This obviously does not work because when the sphere leaves, it just gets an forced up velocity.
How can I achieve this? Is there a way to calculate the leaving angle and then apply force to that direction? Do i need to change transform.RotateAround with physics or something completely different?
Thanks!
My Code: (A bit werid at the "Orbiting" logic, I know :/ )
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour {
public float playerSpeed = 1.5f;
public bool Orbiting = false;
GameObject Sphere;
public Rigidbody2D Player_rb;
public Transform center;
public Vector3 axis = Vector3.forward;
public Vector3 desiredPosition;
public float radius = 1.2f;
public float radiusSpeed = 2f;
public float rotationSpeed = 80.0f;
void Start() {
/*
Sphere = GameObject.FindWithTag("Sphere");
center = Sphere.transform;
transform.position = (transform.position - center.position).normalized * radius + center.position;
radius = 1.2f;
*/
}
void Player_Movement() {
if(Orbiting == true) {
Player_rb.isKinematic = true;
transform.RotateAround(center.position, axis, rotationSpeed * Time.deltaTime);
desiredPosition = (transform.position - center.position).normalized * radius + center.position;
transform.position = Vector3.MoveTowards(transform.position, desiredPosition, Time.deltaTime * radiusSpeed);
} else {
Player_rb.isKinematic = false;
if(Player_rb.velocity.magnitude < playerSpeed) {
Player_rb.AddForce(transform.up * playerSpeed);
} else {
return;
}
}
}
void Update() {
if (Input.GetKey("space")) {
Orbiting = true;
} else {
Orbiting = false;
}
Debug.Log(Player_rb.velocity.magnitude);
}
void FixedUpdate() {
Player_Movement();
}
}