Estoy tratando de darme cuenta de que me muevo en un objeto alrededor de la esfera (caminar sobre él), pero cuando llega al ecuador de la esfera, deja de moverse.
public Transform planet; public bool AlignToPlanet; public float gravityConstant = -9.8f; void FixedUpdate() { Vector3 toCenter = planet.position - transform.position; toCenter.Normalize(); GetComponent<Rigidbody>().AddForce(toCenter * 9.8f, ForceMode.Acceleration); if (AlignToPlanet) { Quaternion q = Quaternion.FromToRotation(-transform.up, -toCenter); q = q * transform.rotation; transform.rotation = Quaternion.Slerp(transform.rotation, q, 1); } Debug.Log(CrossPlatformInputManager.GetAxis("Vertical")); GetComponent<Rigidbody>().AddForce(transform.forward * 2, ForceMode.Impulse); }En primer lugar, debe evitar llamar a GetComponent más de lo necesario. Simplemente llámelo una vez para obtener Rigidbody en Awake y luego consulte el resultado en FixedUpdate .
En segundo lugar, una vez que determine la dirección hacia arriba del objeto, puede usar productos cruzados para determinar cuál sería el avance más cercano al anterior mientras lo mantiene arriba.
Luego, puede usar Quaternion.LookRotation para configurarlo y reenviarlo.
Finalmente, debe usar Rigidbody.MoveRotation para establecer la rotación.
En total:
private Rigidbody rb; public Transform planet; public bool AlignToPlanet; public float gravityConstant = -9.8f; void Awake() { rb = GetComponent<Rigidbody>(); } void FixedUpdate() { Vector3 toCenter = planet.position - transform.position; toCenter.Normalize(); rb.AddForce(toCenter * 9.8f, ForceMode.Acceleration); if (AlignToPlanet) { Vector3 newUp = -toCenter; Vector3 newRight = Vector3.Cross(newUp, transform.forward); Vector3 newForward = Vector3.Cross(newRight, newUp); Quaternion newRot = Quaternion.LookRotation(newForward, newUp); rb.MoveRotation(q); } Debug.Log(CrossPlatformInputManager.GetAxis("Vertical")); rb.AddForce(transform.forward * 2, ForceMode.Impulse); }Configuré un nuevo proyecto con su script, y funciona bien para mí.
Las únicas cosas que cambié (además de AddForce en el reenvío para probarlo) son:
FromToRotation en el que pasas vectores opuestos (uno hacia arriba y otro hacia abajo)Slerp lo eliminé, no sirve de nada ya que le pasa un valor de 1.Entonces, se ve así:
if (AlignToPlanet) { // removed the minus in front of toCenter Quaternion q = Quaternion.FromToRotation(-transform.up, toCenter); transform.rotation = q * transform.rotation; } EDITAR
Estoy de acuerdo con @Ruzhim: LookRotation es una mejor manera de calcular su nueva rotación, ya que también toma el avance de su objeto. (Y por el hecho de no usar el GetComponent en ninguna Actualización)