Bagaimana saya bisa mencegah benda-benda kaku saling bergerak menggunakan fisika bawaan Unity?

8

Saya mencoba membuat game di mana objek dapat diseret, tetapi saya mengalami masalah dengan fisika. Dengan tubuh kaku yang memiliki massa serupa, mereka terkadang saling mendorong ketika diseret dan menyebabkan gerakan yang tidak diinginkan. Ini demo .

Saya ingin melakukan ini hanya menggunakan fisika bawaan Unity 3D .

Dalam demo, Anda dapat menggunakan mouse untuk mengklik dan menarik objek. Semua silinder memiliki colliders kotak dan massa 10000. Mereka juga memiliki berbagai kendala tergantung pada orientasinya (tidak ada yang bisa berputar, dan semua dibatasi dalam x atau y). Bola memiliki massa 1, bola lingkup dan kendala az.

Bola dan silinder berinteraksi dengan baik. Namun menyeret silinder satu sama lain menyebabkan persimpangan. Saya tidak mau ini!

Silinder memiliki interpolasi diatur ke 'Interpolasi' dan deteksi tumbukan diatur ke 'Berkelanjutan'. Saya telah melemparkan skrip 'DontGoThroughThings' ke semua silinder, tetapi sepertinya tidak melakukan apa-apa. Sedangkan untuk mengatur kecepatan rigidbodies, saya telah menggunakan kedua baris berikut dengan hasil yang pada dasarnya sama:

rb.AddForce(speed * diff * Time.deltaTime - rb.velocity, ForceMode.VelocityChange);
//rb.velocity = speed * diff * Time.deltaTime;

Tanpa menulis kode deteksi tabrakan saya sendiri, saya kehabisan ide. Apakah ada pengaturan sederhana atau sesuatu yang saya lewatkan?

Dengan dijelaskan konteksnya, inilah pertanyaan yang lebih tepat: "Bagaimana saya bisa mendapatkan silinder di demo saya untuk tidak saling bergerak?"

Jeff
sumber
Apakah mengurangi massa silinder membuat perbedaan?
MGB
Tidak, itu akan membuat mereka lebih mudah menurut saya. Juga jika massa mirip dengan bola, bola akan mulai melewati silinder juga.
Jeff
Apa yang membuatmu berpikir seperti ini? Ketika rasio massa lebih besar, mesin fisika memiliki lebih banyak masalah dengan presisi.
MGB
Karena saya mencobanya: PI dapat mengunggah demo di mana semua massa diatur ke 1 jika Anda mau.
Jeff
Satu hal yang saya pikirkan adalah mungkin karena cara saya mengubah kecepatan. Saya akan mencoba mengubah kekuatan sebagai gantinya
Jeff

Jawaban:

2

Tanpa melihat proyek / kode Anda, saya ingin menyarankan ini:

private bool _mouseOverObject = false;

void Update(){
    if(_mouseOverObject && Input.GetMouseDown(0){
        rigidbody.isKinematic = false; //Let Unity Physics affect the item.
    } else {
        rigidbody.isKinematic = true; //Let it affect other physics but not be affected itself
    }
}

void OnMouseOver(){
    _mouseOverObject = true;
}

void OnMouseExit(){
    _mouseOverObject = false;
}

Ini akan memungkinkan Anda untuk membatasi fisika tetapi dalam ruang lingkup dan mesin fisika Unity. Anda dapat bergoyang-goyang dengan skrip untuk membuatnya mengunci hanya satu objek yang akan dipindahkan dll tetapi ini harus Anda mulai.

Piddock Tom 'Biru'
sumber
0

Anda ingin deteksi tabrakan diatur Continuous Dynamicuntuk objek yang bergerak cepat. Continuousdigunakan untuk objek statis atau bergerak lambat yang Continuous Dynamicobjek bertabrakan. Lihat di sini .

(Perlu diingat bahwa deteksi tabrakan terus menerus mahal, jadi gunakan dengan hemat)

BlueRaja - Danny Pflughoeft
sumber
Saya mendapatkan hasil yang sama ketika saya mengatur masing-masing silinder ke Continuous Dynamic. Apakah itu yang kamu maksud?
Jeff