Comment changer la gravité vers un certain objet dans Unity?

14

J'ai deux sphères dans Unity. L'un est de taille 1000x l'autre est de taille 1x. Je veux donc que la plus petite sphère soit attirée par une plus grande sphère. Alors, comment dois-je faire. Je sais que cela peut se faire par gravité en utilisant un corps rigide. Mais comment changer l'angle de gravité vers la grande sphère?

Hussain Murtaza
la source

Réponses:

19

La gravité dans le moteur physique Unity ne va que dans une seule direction et est contrôlée dans le menu Physique du menu Edition-> Paramètres du projet.

entrez la description de l'image ici

Si vous voulez faire autre chose que cela, vous devrez implémenter votre propre gravité.

Fondamentalement, vous pouvez ajouter un collisionneur de sphères sur l'objet que vous souhaitez être le centre de gravité. Le collisionneur doit englober toute la zone où vous souhaitez que les objets soient affectés par la gravité de cet objet. Chaque fois qu'un objet entre en collision avec cette "sphère d'influence", vous lui appliquez une force. Vous continuez à lui appliquer une force tant qu'elle se trouve à l'intérieur de la sphère d'influence.

La constante gravitationnelle que vous utilisez peut être modifiée par vous, mais celle standard utilisée pour les calculs dans le monde réel est:

F = Gm1m2 / r2

Épelé c'est:

Force = constante gravitationnelle * masse de l'objet 1 * masse de l'objet 2 / distance entre les deux objets au carré.

Notez que la constante gravitationnelle n'est pas 9,81. C'est l'accélération causée par la gravité à la surface de la Terre.

MichaelHouse
la source
1

Il n'est pas nécessaire de recourir à l'équation gravitationnelle. L'accélération due à la gravité est constante quelle que soit la masse, donc tout ce que vous voulez faire est d'accélérer vos petits objets vers le grand objet de chaque image.

Le code ressemblerait à ceci:

public void FixedUpdate()
{
    rigidbody.velocity += gravitationalAcceleration * Time.fixedTime * (largeObject.transform.position - transform.position);
}
BlueRaja - Danny Pflughoeft
la source
1

En fait, je travaille actuellement sur un jeu basé sur la gravité: simplement, vous placez des étoiles pour déplacer votre joueur à travers des orbites elliptiques et l'effet de fronde. J'ai désactivé la gravité et utilisé ce code:

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 Le code bouclait à l'origine à travers un tableau de toutes les planètes: cela est édité et peut donc ne pas être complètement correct. Mais ça devrait aller.

As-tu vu cet homme
la source
0

J'ai travaillé sur un projet similaire basé sur Zero-G dans lequel j'ai besoin de tous les objets de jeu pour générer et réagir à la fois à la force gravitationnelle et électromagnétique en fonction de leur volume, densité, masse, énergie et conductivité. Je suis relativement nouveau dans le script, mais j'ai apporté quelques modifications au script ci-dessus pour le faire fonctionner pour moi dans un espace 3D (en ce qui concerne la gravité ... presque ...):

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

Comme vous pouvez le voir, je travaille toujours dessus, essentiellement tous mes ajouts jusqu'à présent, annotés avec "BBB", ne fonctionnent pas encore comme je le voudrais. Mais en l'état, cela permet à mes objets "bloc ALPHA" d'interagir gravitationnellement en 3D avec d'autres objets "bloc ALPHA" d'une manière assez prévisible. (bien que, lorsque vous placez deux blocs ou plus, le dernier soit toujours "l'attracteur" et restera stationnaire jusqu'à ce qu'une collision se produise. sur laquelle je travaille ... l'aide serait appréciée :)) J'espère que cela aide ..

Vinny Real Hard Ink Vince
la source
1
Si vous souhaitez poser une question, postez-la en tant que question s'il vous plaît, ne l'enfoncez pas dans votre réponse.
mon mauvais, merci pour avoir pris soin de cela, ne se reproduira plus :)
Vinny Real Hard Ink Vince
0

Demandez à la planète / grande sphère avec un collisionneur de cercle, donnez-lui un enfant. Maintenant, la planète doit être étiquetée planète ou objet cosmique statique, et l'enfant doit être étiqueté Zone d'influence. Maintenant, le petit objet devrait avoir un corps rigide et une sphère avec un isTrigger.

Mettez un script sur la planète avec un déclencheur d'entrée / entrée, s'il s'agit d'une sphère d'influence, il doit être tiré vers cela.

Sinon, vous pouvez le faire dans l'autre sens. Mais dans tous les cas, ce serait probablement mieux puisque vous voulez très probablement rendre l'attraction gravitationnelle différente d'une planète à l'autre.

Peter J
la source
-2

Ce que d'autres ont dit, la gravité sur l'unité n'est que dans une certaine direction, alors peut-être devriez-vous plutôt désactiver complètement la gravité et scénariser une force qui déplace la petite sphère vers l'énorme.

Iridium616
la source