จะเปลี่ยน Gravity ไปยังวัตถุบางอย่างใน Unity ได้อย่างไร


14

ฉันมีสองทรงกลมในความสามัคคี หนึ่งคือ 1,000x ในขนาดอื่น ๆ คือ 1x ในขนาด ดังนั้นฉันต้องการให้รูปทรงกลมขนาดเล็กลงดึงดูดให้เป็นทรงกลมที่ใหญ่กว่า ดังนั้นฉันจะทำอย่างไร ฉันรู้ว่ามันสามารถลดลงผ่านแรงโน้มถ่วงโดยใช้ร่างกายที่แข็ง แต่ฉันจะเปลี่ยนมุมโน้มถ่วงไปสู่ทรงกลมขนาดใหญ่ได้อย่างไร

คำตอบ:


19

แรงโน้มถ่วงในเอ็นจินฟิสิกส์ของ Unity จะไปในทิศทางเดียวเท่านั้นและถูกควบคุมในเมนูฟิสิกส์ในเมนูแก้ไข -> การตั้งค่าโครงการ

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณต้องการทำสิ่งอื่นนอกเหนือจากนั้นคุณจะต้องใช้แรงโน้มถ่วงของคุณเอง

โดยทั่วไปคุณสามารถเพิ่ม collider ทรงกลมบนวัตถุที่คุณต้องการให้เป็นจุดศูนย์กลางของแรงโน้มถ่วง Collider ควรครอบคลุมพื้นที่ทั้งหมดที่คุณต้องการให้วัตถุได้รับผลกระทบจากแรงโน้มถ่วงของวัตถุนั้น เมื่อใดก็ตามที่วัตถุชนกับ "ขอบเขตแห่งอิทธิพล" นี้คุณจะใช้แรงนั้น คุณยังคงบังคับมันต่อไปตราบเท่าที่มันอยู่ในขอบเขตอิทธิพล

ค่าความโน้มถ่วงที่คุณใช้นั้นคุณสามารถปรับแต่งได้ แต่ค่ามาตรฐานที่ใช้สำหรับการคำนวณในโลกแห่งความจริงคือ:

F = Gm1m2 / r2

สะกดว่า:

Force = ค่าคงตัวโน้มถ่วงของโลก * มวลของวัตถุ 1 * มวลของวัตถุ 2 / ระยะห่างระหว่างวัตถุทั้งสองกำลังสอง

โปรดทราบว่าค่าคงที่แรงโน้มถ่วงไม่ใช่ 9.81 นั่นคือความเร่งที่เกิดจากแรงโน้มถ่วงที่ผิวโลก


1

ไม่จำเป็นต้องหันไปใช้สมการความโน้มถ่วง การเร่งความเร็วเนื่องจากแรงโน้มถ่วงคงที่โดยไม่คำนึงถึงมวลดังนั้นสิ่งที่คุณต้องทำคือเร่งวัตถุเล็ก ๆ ของคุณไปยังวัตถุขนาดใหญ่ในแต่ละเฟรม

รหัสจะมีลักษณะดังนี้:

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

1

ในความเป็นจริงฉันกำลังทำงานกับเกมที่มีแรงโน้มถ่วง: เพียงแค่คุณใส่ดาวเพื่อย้ายผู้เล่นของคุณผ่านวงโคจร eliptical และเอฟเฟกต์หนังสติ๊ก ฉันปิดการใช้งานแรงโน้มถ่วงและใช้รหัสนี้:

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 ซึ่งฉันต้องการวัตถุเกมทั้งหมดเพื่อสร้างและตอบสนองต่อแรงโน้มถ่วงและแม่เหล็กไฟฟ้าตามปริมาณความหนาแน่นมวลพลังงานและการนำไฟฟ้า ฉันค่อนข้างใหม่เกี่ยวกับการเขียนสคริปต์ แต่ฉันได้ทำการปรับเปลี่ยนสคริปต์ด้านบนเล็กน้อยเพื่อให้มันทำงานกับฉันในพื้นที่ 3 มิติ (เท่าที่เกี่ยวข้องกับแรงโน้มถ่วง ... เกือบ ... ):

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" ยังไม่ทำงานตามที่ฉันต้องการ แต่เมื่อมันมาถึงมันทำให้วัตถุ "block ALPHA" ของฉันสามารถโต้ตอบกับแรงโน้มถ่วงในแบบ 3 มิติกับวัตถุ "block ALPHA" อื่น ๆ ในวิธีที่คาดการณ์ได้อย่างเป็นธรรม (แม้ว่าเมื่อวางบล็อกสองบล็อกขึ้นไปบล็อกสุดท้ายจะเป็น "ตัวดึงดูด" เสมอและจะไม่หยุดนิ่งจนกว่าจะเกิดการชนกันซึ่งฉันกำลังทำงานอยู่ ... จะช่วยให้ชื่นชม :)) หวังว่าจะช่วย ..


1
หากคุณต้องการถามคำถามโพสต์คำถามโปรดอย่าฝังไว้ในคำตอบของคุณ

ไม่ดีของฉันขอบคุณสำหรับการดูแลของมันจะไม่เกิดขึ้นอีกครั้ง :)
Vinny ยากจริงหมึกวินซ์

0

มีโลก / ทรงกลมขนาดใหญ่ที่มี collider วงกลมให้เด็ก ตอนนี้ดาวเคราะห์ควรถูกติดแท็กดาวเคราะห์หรือวัตถุคอสมิคสแตติกและเด็กควรได้รับการระบุว่าเป็นเขตอิทธิพล ตอนนี้วัตถุขนาดเล็กควรมีความแข็งแกร่งและทรงกลมที่มี isTrigger

วางสคริปต์บนดาวเคราะห์โดยใช้ทริกเกอร์ enter / enterstay ถ้ามันมีอิทธิพลอย่างหนึ่ง

มิฉะนั้นคุณสามารถทำสิ่งอื่น ๆ ได้ แต่ในกรณีใด ๆ สิ่งนี้อาจจะดีกว่าเนื่องจากคุณต้องการดึงแรงโน้มถ่วงที่แตกต่างจากดาวเคราะห์สู่ดาวเคราะห์


-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
สิ่งนี้จะเปลี่ยนทิศทางของแรงโน้มถ่วงโลก ไม่เพียง แต่สำหรับวัตถุหนึ่งชิ้น
Philipp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.