Bagaimana cara mengubah Gravity ke objek tertentu di Unity?


14

Saya memiliki dua bidang di Unity. Satu ukuran 1000x dan ukuran 1x. Jadi saya ingin bola yang lebih kecil tertarik ke bola yang lebih besar. Jadi bagaimana saya melakukannya. Saya tahu itu bisa turun melalui gravitasi menggunakan tubuh yang kaku. Tapi bagaimana cara mengubah sudut gravitasi menuju bola besar?

Jawaban:


19

Gravitasi di mesin fisika Unity hanya berjalan dalam satu arah dan dikendalikan di menu Fisika di menu Edit-> Pengaturan Proyek.

masukkan deskripsi gambar di sini

Jika Anda ingin melakukan sesuatu selain itu, Anda harus menerapkan gravitasi Anda sendiri.

Pada dasarnya, Anda bisa menambahkan spider collider pada objek yang Anda inginkan sebagai pusat gravitasi. Collider harus mencakup seluruh area di mana Anda ingin objek dipengaruhi oleh gravitasi dari objek itu. Setiap kali sebuah objek bertabrakan dengan "lingkup pengaruh" ini, Anda menerapkan kekuatan padanya. Anda terus menerapkan kekuatan selama itu di dalam lingkup pengaruh.

Konstanta gravitasi yang Anda gunakan dapat diubah oleh Anda, tetapi standar yang digunakan untuk perhitungan di dunia nyata adalah:

F = Gm1m2 / r2

Dijelaskan itu:

Gaya = Konstanta gravitasi * massa objek 1 * massa objek 2 / jarak antara dua objek kuadrat.

Perhatikan bahwa tetapan gravitasi bukan 9,81. Itulah percepatan yang disebabkan oleh gravitasi di permukaan bumi.


1

Tidak perlu menggunakan persamaan gravitasi. Akselerasi karena gravitasi adalah konstan terlepas dari massa, jadi yang ingin Anda lakukan adalah mempercepat objek kecil Anda menuju objek besar setiap frame.

Kode akan terlihat seperti ini:

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

1

Faktanya, saat ini saya sedang mengerjakan permainan berbasis gravitasi: sederhananya, Anda menempatkan bintang untuk menggerakkan pemain Anda melalui orbit elips dan efek ketapel. Saya menonaktifkan gravitasi, dan menggunakan kode ini:

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 Kode awalnya dilingkarkan melalui array semua planet: ini diedit dan karena itu mungkin tidak sepenuhnya benar. Itu harus baik-baik saja.


0

Saya telah mengerjakan proyek serupa yang berbasis di Zero-G di mana saya membutuhkan semua objek game untuk menghasilkan dan bereaksi terhadap gaya gravitasi dan elektromagnetik berdasarkan volume, kepadatan, massa, energi, dan konduktivitas. Saya relatif baru dalam scripting, tetapi saya telah membuat beberapa modifikasi pada script di atas untuk membuatnya bekerja untuk saya dalam ruang 3D (sejauh menyangkut gravitasi ... hampir ...):

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

Seperti yang Anda lihat, saya masih mengerjakannya, pada dasarnya semua tambahan saya sejauh ini, dijelaskan dengan "BBB", belum berfungsi seperti yang saya inginkan. Tapi seperti berdiri, itu memungkinkan "blok ALPHA" objek saya untuk berinteraksi secara gravitasi di 3d dengan objek "blok ALPHA" lainnya dengan cara yang cukup dapat diprediksi. (walaupun, ketika menempatkan dua atau lebih blok, yang terakhir selalu menjadi "penarik" dan akan tetap diam sampai terjadi tabrakan. yang sedang saya kerjakan ... bantuan akan dihargai :)) Semoga ini membantu ..


1
Jika Anda ingin mengajukan pertanyaan, silakan posting sebagai pertanyaan, jangan dimakamkan di jawaban Anda.

salahku, terima kasih sudah membereskannya, tidak akan terjadi lagi :)
Vinny Real Hard Ink Vince

0

Memiliki planet / bola besar dengan lingkaran collider, beri anak. Sekarang, planet tersebut harus diberi tag planet atau objek kosmik statis, dan anak tersebut harus diberi label Area pengaruh. Sekarang objek kecil harus memiliki benda tegar dan bola dengan isTrigger.

Letakkan skrip di planet ini dengan pemicu enter / enterstay, jika itu adalah lingkup pengaruh maka harus ditarik ke sana.

Lain Anda bisa melakukannya sebaliknya. Tetapi bagaimanapun juga ini mungkin akan lebih baik karena Anda kemungkinan besar ingin membuat tarikan gravitasi berbeda dari satu planet ke planet lainnya.


-2

Apa yang orang lain katakan, gravitasi pada persatuan hanya menuju arah tertentu, jadi mungkin Anda harus menonaktifkan gravitasi sepenuhnya dan menyusun gaya yang menggerakkan bola kecil menuju arah yang besar.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.