Como mudar a Gravidade para um determinado objeto no Unity?


14

Eu tenho duas esferas na Unity. Um é de tamanho 1000x, o outro é de tamanho 1x. Então, eu quero que a esfera menor seja atraída para uma esfera maior. Então, como eu faço isso. Eu sei que isso pode ser causado pela gravidade usando corpo rígido. Mas como eu mudo o ângulo de gravidade em direção à grande esfera?

Respostas:


19

A gravidade no mecanismo de física do Unity segue apenas em uma direção e é controlada no menu Física no menu Editar-> Configurações do projeto.

insira a descrição da imagem aqui

Se você quiser fazer algo diferente disso, precisará implementar sua própria gravidade.

Basicamente, você pode adicionar um colisor de esferas ao objeto que deseja que seja o centro de gravidade. O colisor deve abranger toda a área em que você deseja que os objetos sejam afetados pela gravidade desse objeto. Sempre que um objeto colide com essa "esfera de influência", você aplica uma força a ele. Você continua aplicando uma força a ela, desde que esteja dentro da esfera de influência.

A constante gravitacional que você usa pode ser ajustada por você, mas a padrão usada para cálculos no mundo real é:

F = Gm1m2 / r2

Explicado que é:

Força = constante gravitacional * massa do objeto 1 * massa do objeto 2 / a distância entre os dois objetos ao quadrado.

Observe que a constante gravitacional não é 9,81. Essa é a aceleração causada pela gravidade na superfície da Terra.


1

Não há necessidade de recorrer à equação gravitacional. A aceleração devido à gravidade é constante, independentemente da massa; portanto, tudo o que você quer fazer é acelerar seus objetos pequenos em direção ao objeto grande em cada quadro.

O código ficaria assim:

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

1

Na verdade, atualmente estou trabalhando em um jogo baseado na gravidade: simplesmente, você coloca estrelas para mover seu jogador através de órbitas elípticas e do efeito estilingue. Desativei a gravidade e usei 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);
            }
        }
    }
}

PS O código originalmente percorreu uma matriz de todos os planetas: isso é editado e, portanto, pode não estar totalmente correto. Deve estar tudo bem.


0

Eu tenho trabalhado em um projeto semelhante baseado em Zero-G, no qual preciso de todos os objetos do jogo para gerar e reagir às forças gravitacionais e eletromagnéticas, com base no volume, densidade, massa, energia e condutividade. Sou relativamente novo em scripts, mas fiz algumas modificações no script acima para fazê-lo funcionar em um espaço 3D (no que diz respeito à gravidade ... quase ...):

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 você pode ver, ainda estou trabalhando nisso, basicamente todas as minhas adições até agora, anotadas com "BBB", ainda não estão funcionando como eu gostaria. Mas, como está, ele permite que meus objetos "block ALPHA" interajam gravitacionalmente em 3d com outros objetos "block ALPHA" de maneira bastante previsível. (embora, ao colocar dois ou mais blocos, o último seja sempre o "atrator" e permaneça estacionário até que ocorra uma colisão. na qual estou trabalhando ... a ajuda seria apreciada :)) Espero que ajude ..


1
Se você quiser fazer uma pergunta, poste-a como uma pergunta, por favor, não a enterre na sua resposta.

meu mau, obrigado por cuidar dele, não vai acontecer novamente :)
Vinny real rígido Ink Vince

0

Tenha o planeta / grande esfera com um colisor de círculos, dê a ele um filho. Agora, o planeta deve ser marcado como planeta ou objeto cósmico estático, e a criança deve ser rotulada como Área de influência. Agora, o objeto pequeno deve ter um corpo rígido e uma esfera com um isTrigger.

Coloque um script no planeta com um gatilho ao entrar / entostar, se for uma esfera de influência, ele deve ser puxado para isso.

Caso contrário, você pode fazer o contrário. Mas, em qualquer caso, isso provavelmente seria melhor, já que você provavelmente deseja fazer com que a força gravitacional seja diferente de planeta para planeta.


-2

O que os outros disseram, a gravidade na unidade é apenas em direção a uma determinada direção; portanto, talvez você deva desativar completamente a gravidade e escrever uma força que move a pequena esfera em direção à enorme.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.