Як змінити Гравітацію до певного об'єкта в Єдності?


14

У мене є дві сфери в Єдності. Один розміром 1000x, інший розміром 1х. Тому я хочу, щоб менша сфера була залучена до більшої сфери. То як мені це зробити. Я знаю, що це може бути знижено через гравітацію, використовуючи жорстке тіло. Але як я можу змінити кут гравітації у бік великої сфери?

Відповіді:


19

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

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

Якщо ви хочете зробити щось інше, ніж це, вам доведеться реалізувати власну гравітацію.

В основному, ви можете додати кульовий колайдер на об'єкт, який хочете бути центром ваги. Колайдер повинен охоплювати всю область, де ви хочете, щоб на об'єкти впливала сила тяжіння цього об'єкта. Щоразу, коли об’єкт стикається з цією «сферою впливу», ви застосовуєте до нього силу. Ви продовжуєте прикладати до нього силу, поки вона знаходиться у сфері впливу.

Гравітаційна константа, яку ви використовуєте, може бути налаштована вами, але стандартна, яка використовується для розрахунків у реальному світі:

F = Gm1m2 / r2

Прописано, що:

Сила = Постійна гравітації * маса предмета 1 * маса предмета 2 / відстань між двома об’єктами у квадраті.

Зауважте, що гравітаційна константа не дорівнює 9,81. Це прискорення, спричинене гравітацією на земній поверхні.


1

Не потрібно вдаватися до гравітаційного рівняння. Прискорення за рахунок сили тяжіння є постійними незалежно від маси, тому все, що ви хочете зробити, - це прискорити свої маленькі предмети до великого об'єкта кожного кадру.

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

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

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", ще не функціонують так, як я хотів би. Але на даний момент це дозволяє моїм об'єктам "блокувати ALPHA" гравітаційно взаємодіяти в 3d з іншими "блоковими ALPHA" об'єктами досить передбачувано. (хоча при розміщенні двох або більше блоків останній завжди є "аттрактором" і залишатиметься нерухомим, поки не станеться зіткнення. Я працюю над ... допомога буде оцінена :)) Сподіваюсь, це допоможе.


1
Якщо ви хочете задати питання, опублікуйте це як будь-ласка, не поховайте його у своїй відповіді.

мій поганий, дякую, що подбав про це, більше не повториться :)
Vinny Real Hard Ink Vince

0

Попросіть планету / велику сферу із колами, подайте її дитині. Тепер планета повинна бути або позначена міткою планети, або статичним космічним об'єктом, і дитина повинна мати мітку «Область впливу». Тепер малий об’єкт повинен мати жорстке тіло і сферу з isTrigger.

Розмістіть сценарій на планеті з пусковим механізмом "вхід / енстайстайз", якщо це сфера впливу, його слід потягнути до цього.

Інакше ви можете це зробити навпаки. Але в будь-якому випадку це, мабуть, буде краще, оскільки ви, швидше за все, хочете, щоб гравітаційний тяг відрізнявся від планети до планети.


-2

Те, що говорили інші, гравітація на єдність полягає лише у певному напрямку, тому, можливо, вам слід замість цього повністю відключити гравітацію та прописати силу, яка рухає малу сферу до величезної.


-3

Якщо ви хочете змінити гравітацію для конкретної площини, ви можете скористатися цим сценарієм, прикріпленим до площини.

using UnityEngine;

public class ChangeGavityToThisObject : MonoBehaviour
{

    private Quaternion rot;
    private Vector3 gravityValue;

    void Start()
    { 
        gravityValue = Physics.gravity;      
    }

    void Update()
    {
        rot = GetComponent<Transform>().rotation;
        Physics.gravity = rot * gravityValue;
    }
}

GetComponent знаходиться в оновленнях, тому що я хочу зробити можливість змінити обертання цієї площини в грі.


1
Це змінює напрямок глобальної сили тяжіння. Не тільки для одного об’єкта.
Філіп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.