Wie ändere ich die Schwerkraft gegenüber einem bestimmten Objekt in Unity?


14

Ich habe zwei Bereiche in der Einheit. Einer ist 1000x groß, der andere 1x. Ich möchte also, dass die kleinere Kugel von der größeren Kugel angezogen wird. Also, wie mache ich das? Ich weiß, dass es durch die Schwerkraft mit starren Körper sein kann. Aber wie ändere ich den Gravitationswinkel in Richtung der großen Kugel?

Antworten:


19

Die Schwerkraft in der Unity-Physik-Engine geht nur in eine Richtung und wird im Menü Physik im Menü Bearbeiten-> Projekteinstellungen gesteuert.

Bildbeschreibung hier eingeben

Wenn Sie etwas anderes als das tun möchten, müssen Sie Ihre eigene Schwerkraft implementieren.

Grundsätzlich können Sie dem Objekt, das der Schwerpunkt sein soll, einen Kugelcollider hinzufügen. Der Collider sollte den gesamten Bereich umfassen, in dem Objekte von der Schwerkraft des Objekts beeinflusst werden sollen. Immer wenn ein Objekt mit dieser "Einflusssphäre" kollidiert, übt man eine Kraft auf es aus. Sie üben weiterhin eine Kraft auf sie aus, solange sie sich im Einflussbereich befindet.

Die Gravitationskonstante, die Sie verwenden, kann von Ihnen angepasst werden. Die für Berechnungen in der realen Welt verwendete Standardkonstante lautet jedoch:

F = Gm1m2 / r2

Das heißt:

Kraft = Gravitationskonstante * Masse des Objekts 1 * Masse des Objekts 2 / Abstand zwischen den beiden Objekten im Quadrat.

Beachten Sie, dass die Gravitationskonstante nicht 9,81 beträgt. Das ist die durch die Schwerkraft verursachte Beschleunigung an der Erdoberfläche.


1

Es besteht keine Notwendigkeit, auf die Gravitationsgleichung zurückzugreifen. Die Beschleunigung aufgrund der Schwerkraft ist unabhängig von der Masse konstant. Sie müssen also nur Ihre kleinen Objekte auf das große Objekt pro Frame beschleunigen.

Der Code würde ungefähr so ​​aussehen:

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

1

Tatsächlich arbeite ich gerade an einem Spiel, das auf der Schwerkraft basiert: Sie platzieren einfach Sterne, um Ihren Spieler durch die Umlaufbahnen und den Schleudereffekt zu bewegen. Ich habe die Schwerkraft deaktiviert und diesen Code verwendet:

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 Der Code durchlief ursprünglich ein Array aller Planeten: Dieser Code wurde bearbeitet und ist daher möglicherweise nicht vollständig korrekt. Es sollte aber okay sein.


0

Ich habe an einem ähnlichen Projekt in Zero-G gearbeitet, in dem alle Spielobjekte aufgrund ihres Volumens, ihrer Dichte, ihrer Masse, ihrer Energie und ihrer Leitfähigkeit sowohl Gravitations- als auch elektromagnetische Kräfte erzeugen und darauf reagieren müssen. Ich bin relativ neu in der Skripterstellung, aber ich habe einige Änderungen an dem obigen Skript vorgenommen, damit es für mich in einem 3D-Raum funktioniert (was die Schwerkraft betrifft ... fast ...):

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

Wie Sie sehen, arbeite ich immer noch daran, im Grunde funktionieren alle meine Ergänzungen, die mit "BBB" versehen sind, noch nicht so, wie ich es gerne hätte. Aber so wie es aussieht, können meine "Block ALPHA" -Objekte in 3D gravitativ mit anderen "Block ALPHA" -Objekten auf ziemlich vorhersehbare Weise interagieren. (obwohl beim Platzieren von zwei oder mehr Blöcken der letzte immer der "Attraktor" ist und stationär bleibt, bis eine Kollision auftritt. Ich arbeite daran ... Hilfe wäre dankbar :)) Hoffentlich hilft das ..


1
Wenn Sie eine Frage stellen möchten, stellen Sie sie bitte als Frage. Begraben Sie sie nicht in Ihrer Antwort.

Mein Unglück, danke, dass du dich darum gekümmert hast, wird nicht wieder vorkommen :)
Vinny Real Hard Ink Vince

0

Habe den Planeten / die große Kugel mit einem Kreiscollider, gib ihr ein Kind. Nun sollte der Planet entweder als Planet oder als statisches kosmisches Objekt markiert sein und das Kind sollte als Einflussbereich gekennzeichnet sein. Jetzt sollte das kleine Objekt einen starren Körper und eine Kugel mit einem isTrigger haben.

Setzen Sie ein Skript mit einem On-Enter / Enterstay-Trigger auf den Planeten. Wenn es sich um eine Einflusssphäre handelt, sollte es in diese Richtung gezogen werden.

Andernfalls können Sie es umgekehrt tun. Aber in jedem Fall wäre dies wahrscheinlich besser, da Sie höchstwahrscheinlich die Anziehungskraft von Planet zu Planet verändern möchten.


-2

Was andere sagten: Die Schwerkraft auf Einheit ist nur in eine bestimmte Richtung gerichtet. Vielleicht sollten Sie stattdessen die Schwerkraft vollständig deaktivieren und eine Kraft schreiben, die die kleine Kugel in Richtung der großen Kugel bewegt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.