¿Cómo cambiar la gravedad hacia cierto objeto en Unity?


14

Tengo dos esferas en la Unidad. Uno es de tamaño 1000x otro es de tamaño 1x. Entonces quiero que la esfera más pequeña se sienta atraída por una esfera más grande. Entonces, ¿cómo lo hago? Sé que puede descender por gravedad utilizando un cuerpo rígido. Pero, ¿cómo cambio el ángulo de gravedad hacia la gran esfera?

Respuestas:


19

La gravedad en el motor de física de Unity solo va en una dirección y se controla en el menú Física en el menú Editar-> Configuración del proyecto.

ingrese la descripción de la imagen aquí

Si quieres hacer algo más que eso, tendrás que implementar tu propia gravedad.

Básicamente, puede agregar un colisionador de esfera en el objeto que desea que sea el centro de gravedad. El colisionador debe abarcar toda el área donde desea que los objetos se vean afectados por la gravedad de ese objeto. Cada vez que un objeto choca con esta "esfera de influencia", le aplicas una fuerza. Continúas aplicando una fuerza mientras esté dentro de la esfera de influencia.

Puede ajustar la constante gravitacional que utiliza, pero la estándar utilizada para los cálculos en el mundo real es:

F = Gm1m2 / r2

Explicado eso es:

Fuerza = constante gravitacional * masa del objeto 1 * masa del objeto 2 / la distancia entre los dos objetos al cuadrado.

Tenga en cuenta que la constante gravitacional no es 9.81. Esa es la aceleración causada por la gravedad en la superficie de la tierra.


1

No hay necesidad de recurrir a la ecuación gravitacional. La aceleración debida a la gravedad es constante independientemente de la masa, por lo que todo lo que desea hacer es acelerar sus objetos pequeños hacia el objeto grande en cada cuadro.

El código se vería así:

public void FixedUpdate()
{
    rigidbody.velocity += gravitationalAcceleration * Time.fixedTime * (largeObject.transform.position - transform.position);
}

1

De hecho, actualmente estoy trabajando en un juego basado en la gravedad: simplemente, colocas estrellas para mover a tu jugador a través de órbitas elípticas y el efecto tirachinas. Inhabilité la gravedad y usé este código:

using UnityEngine;
using System.Collections;

public class PlanetGrav : MonoBehaviour {

    //Declare Variables:

//Strength of attraction from your sphere (obviously, it can be any type of game-object)
    public float StrengthOfAttraction;

//Obviously, you won't be using planets, so change this variable to whatever you want
    GameObject planet;

    //Initialise code:
    void Start () 
    {
        //Again, you can change the tag to whatever you want.
        planet = GameObject.FindGameObjectWithTag("Planet");
    }

    //Use FixedUpdate because we are controlling the orbit with physics
    void FixedUpdate () {
        //Declare Variables:

    //magsqr will be the offset squared between the object and the planet
        float magsqr;

        //offset is the distance to the planet
        Vector3 offset;

        //get offset between each planet and the player
        offset = planet.transform.position - transform.position;

            //My game is 2D, so  I set the offset on the Z axis to 0
            offset.z = 0;

            //Offset Squared:
            magsqr = offset.sqrMagnitude;

            //Check distance is more than 0 to prevent division by 0
            if (magsqr > 0.0001f)
            {
//Create the gravity- make it realistic through division by the "magsqr" variable

rigidbody2D.AddForce((StrengthOfAttraction * offset.normalized / magsqr) * rigidbody2D.mass);
            }
        }
    }
}

PD: el código originalmente recorrió una matriz de todos los planetas: esto está editado y, por lo tanto, puede no ser completamente correcto. Sin embargo, debería estar bien.


0

He estado trabajando en un proyecto similar basado en Zero-G en el que necesito todos los objetos del juego para generar y reaccionar a la fuerza gravitacional y electromagnética en función de su volumen, densidad, masa, energía y conductividad. Soy relativamente nuevo en las secuencias de comandos, pero he realizado algunas modificaciones en la secuencia de comandos anterior para que funcione en un espacio 3D (en lo que respecta a la gravedad ... casi ...):

using UnityEngine;
using System.Collections;

public class DynamicWeightAnalysis : MonoBehaviour {

//Declare Variables:
//BBB adding volume calculations
//NOPE
//BBB adding density (...does nothing yet...)
public float density;

//BBB NOPE!

//Strength of attraction from your game-object, ideally this will be derived from a calculation involving the objects volume and density, but for now it's entered from the inspector)
public float RelativeWeight;

//BBB Here, we name our target object (s)
GameObject blockALPHA;

//Initialise code:
void Start () 
{
    //BBB here, we define our target object by searching for its tag (setup in editor)
    blockALPHA = GameObject.FindGameObjectWithTag("Block ALPHA");
}

//Use FixedUpdate because we are controlling the orbit with physics
void FixedUpdate () {
    //Declare Variables:

    //magsqr will be the offset squared between the object and the planet
    float magsqr;

    //offset is the distance to the planet
    Vector3 offset;

    //get offset between each planet and the player
    offset = blockALPHA.transform.position - transform.position;

    //Offset Squared:
    magsqr = offset.sqrMagnitude;

    //Check distance is more than 1 to prevent division by 0 (because my blocks are all 1x1x1 so, any closer than 1 and they'd be intersecting)
    if (magsqr > 1f)
    {
        //Create the gravity- make it realistic through division by the "magsqr" variable

        GetComponent<Rigidbody>().AddForce((RelativeWeight * offset.normalized / magsqr) * GetComponent<Rigidbody>().mass);
    }
}
}

Como puede ver, todavía estoy trabajando en ello, básicamente todas mis adiciones hasta ahora, anotadas con "BBB", todavía no funcionan como me gustaría. Pero tal como está, permite que mis objetos "bloquear ALFA" interactúen gravitacionalmente en 3D con otros objetos "bloquear ALFA" de una manera bastante predecible. (aunque, al colocar dos o más bloques, el último siempre es el "atractor" y permanecerá estacionario hasta que ocurra una colisión. En lo que estoy trabajando ... se agradecería la ayuda :)) Espero que eso ayude ...


1
Si desea hacer una pregunta, publíquela como una pregunta, por favor, no la entierre en su respuesta.

mi mal, gracias por cuidarlo, no volverá a suceder :)
Vinny Real Hard Ink Vince

0

Tenga el planeta / esfera grande con un colisionador circular, dele un niño. Ahora, el planeta debería ser etiquetado como planeta u objeto cósmico estático, y el niño debería ser etiquetado como Área de influencia. Ahora, el objeto pequeño debe tener un cuerpo rígido y una esfera con isTrigger.

Ponga una secuencia de comandos en el planeta con un activador on enter / entertay, si se trata de una esfera de influencia, debe ser arrastrado hacia eso.

De lo contrario, puede hacerlo al revés. Pero en cualquier caso, esto probablemente sería mejor, ya que lo más probable es que desee hacer que la atracción gravitacional sea diferente de un planeta a otro.


-2

Lo que otros dijeron, la gravedad en la unidad es solo hacia una determinada dirección, por lo que tal vez deberías deshabilitar la gravedad por completo y escribir una fuerza que mueva la esfera pequeña hacia la enorme.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.