Как изменить гравитацию к определенному объекту в Unity?

14

У меня есть две сферы в Unity. Один размером 1000х, другой размером 1х. Поэтому я хочу, чтобы меньшая сфера притягивалась к большей сфере. Так как мне это сделать. Я знаю, что это может быть вниз через гравитацию, используя твердое тело. Но как мне изменить угол притяжения к большой сфере?

Хуссейн Муртаза
источник

Ответы:

19

Гравитация в физическом движке Unity движется только в одном направлении и управляется в меню «Физика» в меню «Правка» -> «Настройки проекта».

введите описание изображения здесь

Если вы хотите сделать что-то другое, вам придется реализовать собственную гравитацию.

По сути, вы можете добавить сферический коллайдер на объект, который хотите стать центром тяжести. Коллайдер должен охватывать всю область, где вы хотите, чтобы объекты подвергались воздействию силы тяжести этого объекта. Всякий раз, когда объект сталкивается с этой «сферой влияния», вы применяете к нему силу. Вы продолжаете применять силу к ней, пока она находится внутри сферы влияния.

Используемая вами гравитационная постоянная может быть изменена вами, но стандартная, используемая для расчетов в реальном мире:

F = Gm1m2 / r2

Прописано вот что:

Сила = гравитационная постоянная * масса объекта 1 * масса объекта 2 / расстояние между двумя объектами в квадрате.

Обратите внимание, что гравитационная постоянная не 9,81. Это ускорение, вызванное гравитацией на поверхности земли.

MichaelHouse
источник
1

Нет необходимости прибегать к гравитационному уравнению. Ускорение из-за силы тяжести является постоянным независимо от массы, поэтому все, что вы хотите сделать, это ускорять ваши маленькие объекты в направлении крупных объектов в каждом кадре.

Код будет выглядеть примерно так:

public void FixedUpdate()
{
    rigidbody.velocity += gravitationalAcceleration * Time.fixedTime * (largeObject.transform.position - transform.position);
}
BlueRaja - Дэнни Пфлугхофт
источник
1

Фактически, я сейчас работаю над игрой, основанной на гравитации: просто вы размещаете звезды, чтобы перемещать игрока по эллиптическим орбитам и эффекту рогатки. Я отключил гравитацию и использовал этот код:

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 Код изначально проходил через массив всех планет: он отредактирован и поэтому может быть не совсем корректным. Это должно быть хорошо, хотя.

Вы видели этого человека
источник
0

Я работал над аналогичным проектом, основанным на Zero-G, в котором мне нужны все игровые объекты, чтобы генерировать и реагировать как на гравитационную, так и на электромагнитную силу в зависимости от их объема, плотности, массы, энергии и проводимости. Я относительно новичок в написании сценариев, но я внес несколько изменений в сценарий выше, чтобы он работал для меня в трехмерном пространстве (что касается гравитации ... почти ...):

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

Как вы можете видеть, я все еще работаю над этим, в основном все мои дополнения, помеченные «BBB», еще не функционируют так, как мне бы хотелось. Но как бы то ни было, он позволяет моим «блочным АЛЬФА» объектам гравитационно взаимодействовать в 3d с другими «блочными АЛЬФА» объектами довольно предсказуемым образом. (хотя при размещении двух или более блоков последний всегда является «аттрактором» и будет оставаться неподвижным до тех пор, пока не произойдет столкновение. Над этим я работаю ... помощь будет принята с благодарностью :)) Надеюсь, это поможет ..

Винни Реал Хард Инк Винс
источник
1
Если вы хотите задать вопрос, опубликуйте его как вопрос, не хороните его в своем ответе.
мой плохой, спасибо, что позаботился об этом, больше не повторится :)
Винни Реал Хард Инк Винс
0

Имейте планету / большую сферу с круговым коллайдером, дайте это ребенку. Теперь планета должна быть помечена как планета или статический космический объект, а ребенок должен быть помечен как зона влияния. Теперь маленький объект должен иметь твердое тело и сферу с isTrigger.

Поместите сценарий на планете с помощью триггера на вход / вход, если это сфера влияния, его следует потянуть к этому.

Иначе вы можете сделать это наоборот. Но в любом случае это, вероятно, будет лучше, так как вы, скорее всего, хотите, чтобы гравитационное притяжение отличалось от планеты к планете.

Питер Дж
источник
-2

Как говорили другие, гравитация на единстве направлена ​​только в определенном направлении, поэтому, возможно, вам следует вместо этого полностью отключить гравитацию и указать силу, которая перемещает маленькую сферу к огромной.

Iridium616
источник