Làm cách nào để thay đổi Trọng lực về phía đối tượng nhất định trong Unity?


14

Tôi có hai quả cầu trong Unity. Một cái có kích thước 1000x, cái kia có kích thước 1x. Vì vậy, tôi muốn quả cầu nhỏ hơn bị thu hút vào quả cầu lớn hơn. Vì vậy, làm thế nào để tôi làm điều đó. Tôi biết rằng nó có thể xuống thông qua trọng lực bằng cách sử dụng cơ thể cứng nhắc. Nhưng làm thế nào để tôi thay đổi góc trọng lực về phía quả cầu lớn?

Câu trả lời:


19

Trọng lực trong công cụ vật lý Unity chỉ đi theo một hướng và được điều khiển trong menu Vật lý trong menu Chỉnh sửa-> Cài đặt dự án.

nhập mô tả hình ảnh ở đây

Nếu bạn muốn làm một cái gì đó khác hơn thế, bạn sẽ phải thực hiện trọng lực của riêng mình.

Về cơ bản, bạn có thể thêm một máy va chạm hình cầu vào đối tượng bạn muốn trở thành trung tâm của trọng lực. Máy va chạm sẽ bao quanh toàn bộ khu vực mà bạn muốn các vật thể bị ảnh hưởng bởi trọng lực của vật thể đó. Bất cứ khi nào một vật thể va chạm với "phạm vi ảnh hưởng" này, bạn sẽ tác dụng một lực lên nó. Bạn tiếp tục tác dụng một lực lên nó miễn là nó nằm trong phạm vi ảnh hưởng.

Hằng số hấp dẫn bạn sử dụng có thể được điều chỉnh bởi bạn, nhưng tiêu chuẩn được sử dụng để tính toán trong thế giới thực là:

F = Gm1m2 / r2

Đánh vần là:

Lực = Hằng số hấp dẫn * khối lượng của vật 1 * khối lượng của vật 2 / khoảng cách giữa hai vật bình phương.

Xin lưu ý rằng hằng số hấp dẫn không phải là 9,81. Đó là gia tốc gây ra bởi trọng lực ở bề mặt trái đất.


1

Không cần phải dùng đến phương trình hấp dẫn. Gia tốc do trọng lực là không đổi bất kể khối lượng, vì vậy tất cả những gì bạn muốn làm là tăng tốc các vật thể nhỏ của bạn về phía vật thể lớn mỗi khung hình.

Mã sẽ trông giống như thế này:

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

1

Trên thực tế, tôi hiện đang làm việc trên một trò chơi dựa trên lực hấp dẫn: đơn giản, bạn đặt các ngôi sao để di chuyển người chơi của mình thông qua các quỹ đạo elip và hiệu ứng súng cao su. Tôi đã vô hiệu hóa trọng lực và sử dụng mã này:

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 Mã ban đầu được lặp qua một mảng của tất cả các hành tinh: điều này được chỉnh sửa và do đó có thể không hoàn toàn chính xác. Nó sẽ ổn thôi.


0

Tôi đã làm việc trong một dự án tương tự dựa trên Zero-G, trong đó tôi cần tất cả các đối tượng trò chơi để tạo và phản ứng với cả lực hấp dẫn và lực điện từ dựa trên khối lượng, mật độ, khối lượng, năng lượng và độ dẫn của chúng. Tôi còn khá mới với kịch bản, nhưng tôi đã thực hiện một vài sửa đổi cho kịch bản ở trên để làm cho nó hoạt động trong không gian 3D (khi có liên quan đến trọng lực ... gần như ...):

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

Như bạn có thể thấy, tôi vẫn đang làm việc với nó, về cơ bản tất cả các bổ sung của tôi cho đến nay, được chú thích bằng "BBB", vẫn chưa hoạt động như tôi muốn. Nhưng như hiện tại, nó cho phép các đối tượng "chặn ALPHA" của tôi tương tác hấp dẫn trong 3d với các đối tượng "chặn ALPHA" khác theo cách khá dễ đoán. (mặc dù, khi đặt hai hoặc nhiều khối, khối cuối cùng luôn là "điểm thu hút" và sẽ đứng yên cho đến khi xảy ra va chạm. Tôi đang làm việc trên ... sự giúp đỡ sẽ được đánh giá cao :)) Hy vọng điều đó sẽ giúp ..


1
Nếu bạn muốn hỏi một câu hỏi, xin vui lòng gửi nó như một câu hỏi, đừng chôn vùi nó trong câu trả lời của bạn.

xấu của tôi, cảm ơn vì đã quan tâm đến nó, sẽ không xảy ra lần nữa :)
Vinny Real Hard Ink Vince

0

Có hành tinh / quả cầu lớn với máy va chạm hình tròn, cho nó một đứa trẻ. Bây giờ, hành tinh nên được gắn thẻ hành tinh hoặc đối tượng vũ trụ tĩnh, và đứa trẻ nên được gắn nhãn Khu vực ảnh hưởng. Bây giờ đối tượng nhỏ nên có một người cứng nhắc và một hình cầu với isTrigger.

Đặt một tập lệnh trên hành tinh với một kích hoạt enter / enterstay, nếu đó là một phạm vi ảnh hưởng thì nó nên được kéo về phía đó.

Khác, bạn có thể làm điều đó theo cách khác xung quanh. Nhưng trong mọi trường hợp, điều này có lẽ sẽ tốt hơn vì rất có thể bạn muốn tạo ra lực hấp dẫn khác nhau từ hành tinh này sang hành tinh khác.


-2

Những gì người khác nói, trọng lực về sự thống nhất chỉ hướng đến một hướng nhất định, vì vậy có lẽ bạn nên vô hiệu hóa hoàn toàn trọng lực và tạo ra một lực di chuyển quả cầu nhỏ về phía khối lớn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.