- Home /
Question by
Malcolm240104 · Mar 24, 2020 at 04:23 PM ·
rotation2d-physics
Player Rotation to gravity
I am having a problem as the player will keep facing one direction other than rotate according to where he is on the planet. What can I add to solve this issue? For Gravity I followed Brackeys tutorial.
This is the script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GravityAttractor : MonoBehaviour {
public static List<GravityAttractor> Attractors;
public Rigidbody2D rb;
const float G = 6.674f;
public bool attract;
void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
void FixedUpdate()
{
foreach (GravityAttractor attractor in Attractors)
{
if (attractor != this)
{
Attract(attractor);
}
}
}
void OnEnable()
{
if (Attractors == null)
Attractors = new List<GravityAttractor>();
Attractors.Add(this);
}
void OnDisable()
{
Attractors.Remove(this);
}
public void Attract(GravityAttractor objToAttract)
{
if (attract == true)
{
Rigidbody2D rbToAttract = objToAttract.rb;
Vector2 direction = rb.position - rbToAttract.position;
float distance = direction.magnitude;
if (distance == 0f)
return;
float forceMagnitude = G * (rb.mass * rbToAttract.mass) / Mathf.Pow(distance, 2);
Vector2 force = direction.normalized * forceMagnitude;
rbToAttract.AddForce(force);
}
}
}
Any help is appreciated!
Comment
Answer by unity_ek98vnTRplGj8Q · Mar 24, 2020 at 05:17 PM
You can use Quaternion.LookRotation(). Just give it your negative gravity vector as the up direction. I use Quaternion.Slerp here to smooth the rotation, but if you don't need to smooth the rotation you can just set transform.rotation to the target rotation directly
public float speed;
private Quaternion targetRotation;
public void Attract(blahblah)
{
//Do your gravity calculation here
Vector2 gravityDirection; //Use the direction you calculated
targetRotation = Quaternion.LookRotation(rb.transform.forward, -1 * gravityDirection);
rb.transform.rotation = Quaternion.Slerp(rb.transform.rotation, targetRotation, speed * Time.fixedDeltaTime);
}
Your answer