Come cambiare la gravità verso un determinato oggetto in Unity?


14

Ho due sfere in Unity. Uno è di dimensioni 1000x l'altro è di dimensioni 1x. Quindi voglio che la sfera più piccola sia attratta da una sfera più grande. Quindi come lo faccio. So che può essere giù attraverso la gravità usando un corpo rigido. Ma come posso cambiare l'angolo di gravità verso la sfera grande?

Risposte:


19

La gravità nel motore fisico Unity va solo in una direzione ed è controllata nel menu Fisica nel menu Modifica-> Impostazioni progetto.

inserisci qui la descrizione dell'immagine

Se vuoi fare qualcosa di diverso, dovrai implementare la tua gravità.

Fondamentalmente, puoi aggiungere un collisore di sfere sull'oggetto che vuoi essere il baricentro. Il collider dovrebbe comprendere l'intera area in cui si desidera che gli oggetti siano influenzati dalla gravità di quell'oggetto. Ogni volta che un oggetto si scontra con questa "sfera di influenza", si applica una forza ad esso. Continui ad applicare una forza fino a quando è all'interno della sfera di influenza.

La costante gravitazionale che usi può essere modificata da te, ma quella standard utilizzata per i calcoli nel mondo reale è:

F = Gm1m2 / r2

Spiegato che è:

Forza = costante gravitazionale * massa dell'oggetto 1 * massa dell'oggetto 2 / la distanza tra i due oggetti al quadrato.

Si noti che la costante gravitazionale non è 9,81. Questa è l'accelerazione causata dalla gravità sulla superficie terrestre.


1

Non è necessario ricorrere all'equazione gravitazionale. L'accelerazione dovuta alla gravità è costante indipendentemente dalla massa, quindi tutto ciò che vuoi fare è accelerare i tuoi piccoli oggetti verso l'oggetto grande ogni fotogramma.

Il codice sarebbe simile al seguente:

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

1

In effetti, attualmente sto lavorando a un gioco basato sulla gravità: semplicemente, metti le stelle per muovere il tuo giocatore attraverso orbite ellittiche e l'effetto fionda. Ho disabilitato la gravità e ho usato questo codice:

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);
            }
        }
    }
}

PS Il codice originariamente scorreva attraverso un array di tutti i pianeti: questo è stato modificato e quindi potrebbe non essere del tutto corretto. Dovrebbe andare bene però.


0

Ho lavorato su un progetto simile basato su Zero-G in cui ho bisogno di tutti gli oggetti di gioco per generare e reagire alla forza sia gravitazionale che elettromagnetica in base al loro volume, densità, massa, energia e conducibilità. Sono relativamente nuovo allo scripting, ma ho apportato alcune modifiche allo script sopra per farlo funzionare per me in uno spazio 3D (per quanto riguarda la gravità ... quasi ...):

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);
    }
}
}

Come puoi vedere, ci sto ancora lavorando, praticamente tutte le mie aggiunte finora, annotate con "BBB", non funzionano ancora come vorrei. Ma così com'è, permette ai miei oggetti "blocco ALPHA" di interagire gravitazionalmente in 3d con altri oggetti "blocco ALPHA" in modo abbastanza prevedibile. (anche se, quando si posizionano due o più blocchi, l'ultimo è sempre l '"attrattore" e rimarrà fermo fino a quando si verificherà una collisione. Su cui sto lavorando ... l'aiuto sarebbe apprezzato :)) Speriamo che aiuti ..


1
Se vuoi porre una domanda, pubblicala come domanda, per favore, non seppellirla nella tua risposta.

mio male, grazie per esserti preso cura di questo, non succederà più :)
Vinny Real Hard Ink Vince

0

Avere il pianeta / la grande sfera con un collisore circolare, dargli un bambino. Ora, il pianeta dovrebbe essere etichettato come pianeta o oggetto cosmico statico e il bambino dovrebbe essere etichettato come area di influenza. Ora il piccolo oggetto dovrebbe avere un corpo rigido e una sfera con un isTrigger.

Metti una sceneggiatura sul pianeta con un trigger on enter / enterstay, se è una sfera di influenza dovrebbe essere tirata verso di essa.

Altrimenti puoi farlo al contrario. Ma in ogni caso questo sarebbe probabilmente meglio dal momento che molto probabilmente vorresti che la forza gravitazionale fosse diversa da un pianeta all'altro.


-2

Ciò che altri hanno detto, la gravità sull'unità è solo verso una certa direzione, quindi forse dovresti invece disabilitare completamente la gravità e scrivere una forza che sposta la piccola sfera verso quella enorme.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.